Загрузка файла в ASP.NET Core MVC

  • Михаил
  • 12 мин. на прочтение
  • 104
  • 09 Dec 2022
  • 09 Dec 2022

Загрузка файлов — это процесс загрузки файлов из системы пользователя в хранилище веб-приложения. Действия 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 .