从C#客户端应用程序上传到PHP服务器

18

目前我有一个C#应用程序(客户端应用程序),以及一个用PHP编写的Web应用程序。我想在客户端执行特定操作时传输一些文件。以下是上传文件到PHP服务器的客户端代码。

private void button1_Click(object sender, EventArgs e)
{
    System.Net.WebClient Client = new System.Net.WebClient();

    Client.Headers.Add("Content-Type", "binary/octet-stream");

    byte[] result = Client.UploadFile("http://localhost/project1/upload.php", "POST",
                                      @"C:\test\a.jpg");

    string s = System.Text.Encoding.UTF8.GetString(result, 0, result.Length); 
}

这是用于移动文件的upload.php文件。

$uploads_dir = './files/'; //Directory to save the file that comes from client application.
foreach ($_FILES["pictures"]["error"] as $key => $error) {
  if ($error == UPLOAD_ERR_OK) {
     $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
     $name = $_FILES["pictures"]["name"][$key];
     move_uploaded_file($tmp_name, "$uploads_dir/$name");
 }

我从上面的代码中没有得到任何错误信息,但它似乎并未起作用。为什么会这样?我错过了什么吗?


你遇到了哪些错误? - Baba
1
@Baba 我没有收到任何错误信息。但是我的文件没有传输。 - Fawzan Izy
内容类型不应该是 multipart/form-data 吗? - bfavaretto
1
用 $_FILES["file"]["error"] == UPLOAD_ERR_OK 替换 if ($error == UPLOAD_ERR_OK) { - Baba
2个回答

17

你当前的 PHP 代码是用于处理多个文件上传,但你的 C# 代码只上传一个文件。

你需要对 PHP 代码进行一些修改,删除 foreach 循环:

<?php
$uploads_dir = './files'; //Directory to save the file that comes from client application.
if ($_FILES["file"]["error"] == UPLOAD_ERR_OK) {
    $tmp_name = $_FILES["file"]["tmp_name"];
    $name = $_FILES["file"]["name"];
    move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
?>

你还需要确保./files目录存在。

我已经使用你的C#代码测试了以上PHP代码,它完美地工作了。


0

你的php代码看起来没问题,但是你尝试使用$_FILES全局变量中的“picture”键来访问文件。在你的csharp代码中似乎没有指定它。我不知道该怎么做。你可以尝试通过打印$_FILE全局变量或使用array_keys函数来查看它在你的php中的名称。

祝好

编辑:我找到了这个链接,可能会帮助你给上传的文件添加一个“名称”: http://www.bratched.com/en/home/dotnet/69-uploading-multiple-files-with-c.html


我刚刚将它分配为图片。实际上,$_FILES["pictures"]["error"] 代码是什么意思? - Fawzan Izy
这个答案是错误的。问题中的PHP代码用于处理多个文件上传,只有在使用<input name="pictures[]" type="file" />时才有效。 - Xenon
是的,这是错误的。并不是要上传多个文件,正如@Xenon所说的那样。 - Fawzan Izy
我没有将这个链接与上传相关联,只是为了展示如何为上传的文件设置名称而找到的最快方法。Content-Disposition: form-data; name=\"{0}\"{1}{1}" 这是我想要展示给你的唯一内容。解释一下,$_FILE是一个包含上传文件的全局数组。它是一个像$_POST或$_GET一样的全局数组。当您尝试访问这些数组中的值时,您使用一个称为“名称”的键。就像xenon在html文件输入中的示例中,属性名称被设置,这使您可以使用相同的名称访问$_FILE数组。这是我在您的c#代码中没有看到的东西。 - grifos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接