Загрузка файла в ASP.NET Core MVC
Загрузка файлов — это процесс загрузки файлов из системы пользователя в хранилище веб-приложения. Действия ASP.NET Core MVC поддерживают загрузку одного или нескольких файлов с помощью простой привязки модели.
Мы подробно рассмотрели поддержку загрузки файлов в веб-API ASP.NET Core в статье Загрузка файлов с помощью веб-API .NET Core и Angular . Там мы рассмотрели, как загрузить файл с помощью приложения angular на стороне клиента и веб-API ASP.NET Core на стороне сервера.
В этой статье мы рассмотрим, как добиться той же функциональности в приложении ASP.NET Core MVC.
Если вы пропустили некоторые из предыдущих статей серии, рекомендуем посетить страницу серии: серия ASP.NET Core MVC.
Чтобы загрузить исходный код этой статьи, посетите: Загрузка файла в ASP.NET Core MVC.
Давайте приступим к делу.
Создание элемента управления вводом файлов
Чтобы загрузить файлы, давайте создадим новое приложение ASP.NET Core MVC, новый FileUploadController и разработаем HTML-форму с элементом управления вводом файлов для действия Index:
<form method="post" enctype="multipart/form-data" asp-controller="FileUpload" asp-action="Index">
<div class="form-group">
<div class="col-md-10">
<p>Upload one or more files using this form:</p>
<input type="file" name="files" multiple />
</div>
</div>
<div class="form-group">
<div class="col-md-10">
<input type="submit" value="Upload" />
</div>
</div>
</form>
Чтобы поддерживать загрузку файлов, мы должны указать enctype
as multipart/form-data
. Атрибут enctype
указывает, как данные формы должны быть закодированы при отправке на сервер. Атрибут enctype
можно использовать, только если метод формы POST
.
Элемент ввода файла поддерживает загрузку нескольких файлов. Удалив multiple
атрибут элемента ввода, мы можем ограничить его поддержкой только одного файла.
Роль привязки модели
Мы можем получить доступ к отдельным файлам, загруженным в приложение через привязку модели, используя IFormFile
интерфейс. Привязка модели в ASP.NET Core MVC сопоставляет данные из HTTP-запросов с параметрами метода действия. IFormFile
представляет собой файл, отправляемый с помощью , HttpRequest
и имеет следующую структуру:
public interface IFormFile
{
string ContentType { get; }
string ContentDisposition { get; }
IHeaderDictionary Headers { get; }
long Length { get; }
string Name { get; }
string FileName { get; }
Stream OpenReadStream();
void CopyTo(Stream target);
Task CopyToAsync(Stream target, CancellationToken cancellationToken = null);
}
Из соображений безопасности мы никогда не должны полагаться на FileName
свойство или доверять ему без проверки.
При загрузке файлов с использованием привязки модели и интерфейса IFormFile
метод действия может принимать либо один файл IFormFile
, либо IEnumerable<IFormFile>
представление нескольких файлов. Мы можем просмотреть один или несколько загруженных файлов, сохранить их в локальной файловой системе, а затем использовать файлы в соответствии с логикой нашего приложения:
public class FileUploadController : Controller
{
...
[HttpPost("FileUpload")]
public async Task<IActionResult> Index(List<IFormFile> files)
{
long size = files.Sum(f => f.Length);
var filePaths = new List<string>();
foreach (var formFile in files)
{
if (formFile.Length > 0)
{
// full path to file in temp location
var filePath = Path.GetTempFileName(); //we are using Temp file name just for the example. Add your own file path.
filePaths.Add(filePath);
using (var stream = new FileStream(filePath, FileMode.Create))
{
await formFile.CopyToAsync(stream);
}
}
}
// process uploaded files
// Don't rely on or trust the FileName property without validation.
return Ok(new { count = files.Count, size, filePaths });
}
}
Ставим точку останова на Index()
метод и запускаем приложение:
После того, как мы выберем файлы и нажмем «Загрузить», мы можем отладить код, чтобы увидеть, как файлы загружаются в файловую систему сервера.
Здесь мы просто возвращаем общее количество и размер загруженных файлов вместе с путями к файлам.
Файлы, загруженные с использованием этого IFormFile
метода, перед обработкой буферизуются в памяти или на диске веб-сервера. Внутри метода действия IFormFile
содержимое доступно как поток. Помимо локальной файловой системы, файлы можно передавать в хранилище BLOB-объектов Azure или Entity Framework .
Хорошо, с загрузкой файла покончено, давайте подытожим то, что мы узнали.
Вывод
В этой статье мы изучили следующие темы:
- Создание элемента управления загрузкой файлов в приложении ASP.NET Core MVC
- Используйте привязку модели для получения загруженных файлов
- Чтение и копирование файлов в поток
В следующей части этой серии мы рассмотрим внедрение зависимостей в ASP.NET Core MVC .
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.