@kttotto
пофиг на чем писать

Как в ASP.NET WebApi загрузить файл не записывая его на диск?

Во всех примерах upload файла в web api делается через

var provider = new MultipartFormDataStreamProvider(path);
var result = await Request.Content.ReadAsMultipartAsync(provider);


И вот в этот момент ReadAsMultipartAsync(provider) загружаемый файл записывается на диск по пути path.
И для того, чтобы изменить файл (картинку: уменьшить качество и размер) мне надо опять открыть файл на чтение, потом изменить его, потом переписать его. Вообщем много лишних телодвижений с файловой системой.

Обыскал инет и не увидел примеров как загрузить файл в память, взять его из контента, изменить его как мне надо и потом один раз записать его на диск.

На Content есть ReadAsStreamAsync и ReadAsByteArrayAsync, но что с ними дальше делать в этом случае делать, не понятно. На их основе сделать Image.FromStream не получится.
  • Вопрос задан
  • 632 просмотра
Решения вопроса 1
@kttotto Автор вопроса
пофиг на чем писать
Вот решение:

var provider = new MultipartMemoryStreamProvider();
var result = await content.ReadAsMultipartAsync(provider);

var stream = provider.Contents[0];  // если гарантированно один файл передавался, иначе - пройдитесь с помощью foreach
var fileName = stream.Headers.ContentDisposition.FileName.Trim('"');
var imgStream = await stream.ReadAsStreamAsync();
var img = GetImageResize(Image.FromStream(imgStream), width, height);

img.Save($"{basePath}\\{fileName}");


Как заметили, просто вместо потока этого вида MultipartFormDataStreamProvider, создается этот MultipartMemoryStreamProvider.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
petermzg
@petermzg
Самый лучший программист
Для примера:
Stream stream =  await content.ReadAsStreamAsync();
Image image = Image.FromStream(stream);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы