Загрузка Больших Файлов в ASP.NET Core. Окончание
Начало
3. Теперь посмотрим на метод действия контроллера и сервис для загрузки файлов:
[HttpPost("upload")]
[MultipartFormData]
[DisableModelBinding]
public async Task<IActionResult> Upload()
{
var len = await _fileSvc
.UploadAsync(
HttpContext.Request.Body,
Request.ContentType);
return CreatedAtAction(nameof(Upload), len);
}
Здесь у нас есть метод действия HTTP POST, который имеет атрибуты, созданные в предыдущем посте, гарантирующие, что входящий запрос имеет правильный тип содержимого "multipart/form-data" и отключающие проверку модели.Метод вызывает UploadAsync из сервиса FileService, который показан ниже:
public async Task<long> UploadAsync(Метод UploadAsync считывает составные данные из входного потока и сохраняет каждый файл на диск. Файлы должны быть разделены границей, определённой в заголовке Content-Type. Мы извлекаем эту границу в переменную bound, затем читаем каждый файл в цикле. Также вычисляем общий размер загруженных файлов.
Stream file, string contentType)
{
long size = 0;
var bound =
HeaderUtilities.RemoveQuotes(
MediaTypeHeaderValue
.Parse(contentType).Boundary)
.Value;
var reader =
new MultipartReader(bound, file);
var sect =
await reader.ReadNextSectionAsync();
while (sect != null)
{
var fileSec = sect.AsFileSection();
if (fileSec is null) continue;
var path = Path.Combine("uploads",
fileSec.FileName);
await using var stream =
new FileStream(path,
FileMode.Create,
FileAccess.Write,
FileShare.None,
1024);
await fileSec.FileStream?
.CopyToAsync(stream);
size += fileSec.FileStream.Length;
sect = await
reader.ReadNextSectionAsync();
}
return size;
}
Полный и более подробный код проекта на GitHub.
Посмотрим, как отправлять файлы с помощью Postman:
Нужно выбрать опцию form-data и добавить пары ключ-значение, где ключом будет имя файла, а значением - сам файл. Также проверьте, что установлен заголовок Content-Type со значением «
multipart/form-data; border=…» на вкладке заголовков.Итого
Загрузка больших файлов может быть сложной задачей, но использование потоков значительно упрощает этот процесс. Благодаря потокам мы можем эффективно читать и записывать данные небольшими порциями, сводя к минимуму использование памяти и позволяя обрабатывать большие файлы без проблем с производительностью.
Источник: https://code-maze.com/aspnetcore-upload-large-files/