Я пытался загрузить StorageFile (в основном файлы изображений) в файл PHP, чтобы его можно было сохранить на сервере.
public async Task<bool> uploadFile(StorageFile file)
{
try
{
using (HttpMultipartFormDataContent form = new HttpMultipartFormDataContent())
{
using (IInputStream fileStream = await file.OpenSequentialReadAsync())
{
HttpStreamContent streamContent = new HttpStreamContent(fileStream);
form.Add(streamContent, "file", file.Name);
using (HttpClient client = new HttpClient())
{
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri("localhost/uploadFile.php")))
{
request.Content = form;
HttpResponseMessage response = await client.SendRequestAsync(request);
Debug.WriteLine("\nRequest: " + request.ToString());
Debug.WriteLine("\n\nResponse: " + response.ToString());
}
}
}
}
return true;
}
catch (Exception e)
{
Debug.WriteLine(e.Message);
return false;
}
}
<?php
$uploaddir = 'uploads/';
$uploadedFile = $uploaddir . basename($_FILES['file']['name']);
if (move_uploaded_file($_FILES['file']['tmp_name'], $uploadedFile)){
echo 'File upload success!';
} else {
echo 'Possible file upload attack!';
}
?>
Проблема в том, что когда я пытаюсь загрузить файл, он выдает ошибку The object has been closed. (Exception from HRESULT: 0X80000013)
а также Exception thrown: 'System.ObjectDisposedException' in mscorlib.ni.dll
.. Я не понимаю, я делаю загрузку файла внутри using
Скажите, как это можно распорядиться? Я делаю что-то неправильно?
Отладка показывает мне это
Запрос: Метод: POST, RequestUri: ‘Http: //localhost/uploadFile.php‘, Content: Windows.Web.Http.HttpMultipartFormDataContent, TransportInformation: ServerCertificate:’ ‘, ServerCertificateErrorSeverity: None, ServerCertificateErrors: {}, ServerIntermediateCertificates: {}, заголовки: {Accept-Encoding: gzip, deflate}} , Content-Type: multipart / form-data; border = 9955f08b-e82d-428b-82e1-3197e5011ccd}
Ответ: StatusCode: 200, ReasonPhrase: ‘OK’, Версия: 2, Содержимое: Windows.Web.Http.HttpStreamContent, Заголовки: {Соединение: Keep-Alive, Сервер: Apache / 2.4.18 (Ubuntu), Keep-Alive: тайм-аут = 5, макс. = 100, дата: вс, 06 ноября 2016 г. 04:02:40 GMT} {Content-Length: 28, Content-Type: text / html; кодировка = UTF-8}
Используя заявление предоставляет удобный синтаксис, который обеспечивает правильное использование IDisposable объектов. Проще говоря, это поможет вам выполнить Dispose()
метод. Итак, ваш код равен:
HttpMultipartFormDataContent form = new HttpMultipartFormDataContent();
IInputStream fileStream = await file.OpenSequentialReadAsync();
HttpStreamContent streamContent = new HttpStreamContent(fileStream);
form.Add(streamContent, "file", file.Name);
HttpClient client = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri("http://127.0.0.1:9096/hello.php"));
request.Content = form;
HttpResponseMessage response = await client.SendRequestAsync(request);
Debug.WriteLine("\nRequest: " + request.ToString());
Debug.WriteLine("\n\nResponse: " + response.ToString());
request.Dispose();
client.Dispose();
fileStream.Dispose();
form.Dispose();
Вы получите исключение в form.Dispose();
строка кода. Причина в том, что HttpMultipartFormDataContent.Add метод не нуждается в утилизации. На мой взгляд, это не неуправляемый ресурс, который не нуждается в утилизации, другие методы HttpMultipartFormDataContent
класс как ReadAsBufferAsync
может потребоваться избавиться.
Обновите свой код следующим образом, который не будет выбрасывать closed
исключение:
HttpMultipartFormDataContent form = new HttpMultipartFormDataContent();
using (IInputStream fileStream = await file.OpenSequentialReadAsync())
{
HttpStreamContent streamContent = new HttpStreamContent(fileStream);
form.Add(streamContent, "file", file.Name);
using (HttpClient client = new HttpClient())
{
using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, new Uri("http://127.0.0.1:9096/hello.php")))
{
request.Content = form;
HttpResponseMessage response = await client.SendRequestAsync(request);
Debug.WriteLine("\nRequest: " + request.ToString());
Debug.WriteLine("\n\nResponse: " + response.ToString());
}
}
}
Других решений пока нет …