图片未从 Xamarin 上传到 php

Image is not being upload on php from Xamarin

我正在尝试使用 WebClient 将图像从 Xamarin 上传到 php。

我试过这个代码:

赛马林:

System.Net.WebClient client = new System.Net.WebClient();
Uri uri = new Uri($"{APIConfig.SourceUri}/post/postProfilePicBETA");

client.Headers.Add("user-agent", GetString(Resource.String.appVersion));
client.UploadFileAsync(uri, resultUri.Path);

client.UploadFileCompleted += delegate { loadingLayout.Visibility = ViewStates.Gone; this.Finish(); };

PHP代码:

if(!isset($_FILES['image']))
{
  echo json_encode(array("state" => "empty"));
}
else
{
  $imageid = $this->getRandom(20);

  move_uploaded_file($_FILES['image']['tmp_name'], "users/".$imageid.".jpg");
}

但是服务器上没有图片。

我试过使用 html 中的表格,它成功了。

主要问题是您没有向网络服务发送任何有关字段名称的信息。

简而言之:PHP 和.NET 只需要与字段名称匹配即可。遗憾的是,对于 WebClient,它被硬编码为 "file".

[file] => Array
(
    [name] => testabc.jpg
    [type] => application/octet-stream
    [tmp_name] => /tmp/phpgMGIJp
    [error] => 0
    [size] => 31211
)

你可以做的是简单地将 "image" 键更改为 "file" 在你的 PHP 代码中,但在我看来这太笼统了,可能会破坏任何其他客户端使用相同的上传网络服务。因此,最好实际发送字段名称。

例如将您的 PHP 文件修改为:


$keyExpected = 'image';
if(isset($_FILES['file']) && !isset($_FILES[$keyExpected])) {
    //dotnet detected...
    $keyExpected = 'file';   
}

if(!isset($_FILES[$keyExpected]))
{
  echo json_encode(array("state" => "empty"));
}
else
{
  $imageid = $this->getRandom(20);

  move_uploaded_file($_FILES[$keyExpected]['tmp_name'], "users/".$imageid.".jpg");
}

但是您不想编辑 PHP 端而只编辑 .NET 部分,那么您应该使用合适的 HTTP 客户端。

即使是来自 System.Net.Http 的那个(记得导入 System.Net.Http 程序集!):

var content = new MultipartFormDataContent();

string fileName = "file.jpg";
string fieldName = "image";

content.Add(new StreamContent(new FileStream(@"\path\to\your\file.jpg", FileMode.Open, FileAccess.Read, FileShare.Read)), fieldName, fileName);
//content.Add( new StreamContent(mediaFile.GetStream()), "file", mediaFile.Path);

var httpClient = new HttpClient();
var uploadServiceBaseAddress = "http://host.pl/your_web_service.php"
var httpResponseMessage = await httpClient.PostAsync(uploadServiceBaseAddress, content);

//if you output any results...
string result = await httpResponseMessage.Content.ReadAsStringAsync();

如果您使用的是 MediaFile 插件,则可以如下所示:

var content = new MultipartFormDataContent();

string fileName = Path.GetFileName(mediaFile.path);
string fieldName = "image";

content.Add(new StreamContent(mediaFile.GetStream(), FileMode.Open, FileAccess.Read, FileShare.Read)), fieldName, fileName);

var httpClient = new HttpClient();
var uploadServiceBaseAddress = "http://host.pl/your_web_service.php"
var httpResponseMessage = await httpClient.PostAsync(uploadServiceBaseAddress, content);

//if you output any results...
string result = await httpResponseMessage.Content.ReadAsStringAsync();