Я пытаюсь выбрать изображение из галереи устройства и загрузить его на удаленный сервер, преобразовав изображение в байтовый массив и отправить его с помощью php-скрипта.
Скрипт загрузки кажется работающим, потому что файл появляется в каталоге сервера, но когда я открываю страницу, выдается сообщение об ошибке типа «не удается открыть изображение, потому что оно содержит ошибки».
MyPage.xaml.cs
public MyPage()
{
InitializeComponent();
pickPhoto.Clicked += async (sender, args) =>
{
if (!CrossMedia.Current.IsPickPhotoSupported)
{
await DisplayAlert("Photos Not Supported", ":( Permission not granted to photos.", "OK");
return;
}
var file = await CrossMedia.Current.PickPhotoAsync();
if (file == null)
return;
image.Source = ImageSource.FromStream(() =>
{
var stream = file.GetStream();
return stream;
});
//ADD THIS
var httpClient = new HttpClient();
await httpClient.PostAsync("http://mysite.altervista.org/path/upload_file.php?image=", new StreamContent(file.GetStream()));//I tried also without ?image=
//byte[] abyte = ByteArrayFromFile(file_tmp.GetStream());
//await sendImage(abyte);
};
}
public async Task<HttpResponseMessage> sendImage(byte[] byteArray)
{
var client = new HttpClient();
client.BaseAddress = new Uri("http://mysite.altervista.org/");
StringContent str = new StringContent("image="+byteArray.GetValue(), Encoding.UTF8, "application/x-www-form-urlencoded");
var response = await client.PostAsync(new Uri("http://mysite/upload_file.php"), str);
var placesJson = response.Content.ReadAsStringAsync().Result;
System.Diagnostics.Debug.WriteLine("RESPONSE: " + placesJson);
return response;
}
public static byte[] ByteArrayFromFile(Stream location)
{
using (var streamReader = new StreamReader(location))
{
var bytes = default(byte[]);
using (var memstream = new MemoryStream())
{
streamReader.BaseStream.CopyTo(memstream);
bytes = memstream.ToArray();
return bytes;
}
}
}
upload_file.php
<?php
$base=$_REQUEST['image'];
$filename = "myimg.jpg";
//$binary=base64_decode($base); //commented this
header('Content-Type: bitmap; charset=utf-8');
$file = fopen($filename, 'wb');
fwrite($file, $base); //changed $binary to $base
fclose($file);
echo 'Image upload complete, Please check your php file directory';
?>
Использование GET-запроса для отправки файлов не является подходом.
Используйте это вместо:
httpClient.PostAsync("url.com", new StreamContent(stream));
Других решений пока нет …