Я пытаюсь загрузить файлы с использованием аналогичного подхода HttpClient: как загрузить сразу несколько файлов в телефоне Windows.
using (var content = new MultipartFormDataContent())
{
content.Add(CreateFileContent(imageStream, "image.jpg", "image/jpeg"));
content.Add(CreateFileContent(signatureStream, "image.jpg.sig", "application/octet-stream"));
var response = await httpClient.PostAsync(_profileImageUploadUri, content);
response.EnsureSuccessStatusCode();
}
private StreamContent CreateFileContent(Stream stream, string fileName, string contentType)
{
var fileContent = new StreamContent(stream);
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "\"files\"",
FileName = "\"" + fileName + "\""
}; // the extra quotes are key here
fileContent.Headers.ContentType = new MediaTypeHeaderValue(contentType);
return fileContent;
}
Это прекрасно работает при загрузке небольших файлов. Если я попытался загрузить более крупный файл (скажем, > 50 МБ) в устройстве с низким уровнем (512 Мб памяти) он выдает System.OutOfMemoryException. Я использовал диагностические инструменты для мониторинга потребления памяти и заметил, что память экспоненциально растет во время вызова PostAsync. Кажется, он копирует весь контент в память. Прямо сейчас у нас нет поддержки каналов в апи.
Какова наилучшая стратегия для загрузки большого файла с использованием HttpClient в телефонном аппарате с низкой памятью?