图片未从 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();
我正在尝试使用 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();