Загрузка файла (или файлов) в ASP.NET MVC

Привет всем, сегодня рассмотрим примеры того как можно произвести загрузку файла ASP.NET MVC. Полазив в интернете, я обнаружил, много схожего кода, причем очень старого и раздутого. И для этого я покажу свой вариант решения этой задачи.

Загрузка одного файла.

Давайте начнем с просмотром. Вот форма, которая будет отправлять обратно к текущему действию.

<form action="" method="post" enctype="multipart/form-data">
  
  <label for="file">Filename:</label>
  <input type="file" name="file" id="file" />

  <input type="submit" />
</form>

Вот метод действия, он будет отправлять сообщения, которые сохраняют файл в по пути каталог  App_Data с именем «uploads».

[HttpPost]
public ActionResult Index(HttpPostedFileBase file) {
            
  if (file.ContentLength > 0) {
    var fileName = Path.GetFileName(file.FileName);
    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
    file.SaveAs(path);
  }
            
  return RedirectToAction("Index");
}

Обратите внимание , что аргумент метода действия является экземпляром HttpPostedFileBase. ASP.NET MVC 2 представляет новые провайдер значений функции.

  • В то время как модели связующих используются для привязки данных к входящим объектной модели, провайдеры обеспечивают значение абстракции для самих поступающих данных.

В этом случае, есть поставщик значение по умолчанию называется , HttpFileCollectionValueProviderкоторый снабжает загруженные файлы модели binder.Also заменяет,  имя аргумента, фаил , одно и то же имя , как имя входного файла. Это важно для модели связующих , чтобы совпадал загруженный файл в методе действия аргумента.

Загрузка нескольких файлов

В этом случае, мы хотим загрузить несколько файлов. Мы можем просто иметь несколько входов для файлов все с тем же именем.

<form action="" method="post" enctype="multipart/form-data">
    
  <label for="file1">Filename:</label>
  <input type="file" name="files" id="file1" />
  
  <label for="file2">Filename:</label>
  <input type="file" name="files" id="file2" />

  <input type="submit"  />
</form>

Теперь мы просто настроить наше действие контроллера , чтобы принять IEnumerableиз HttpPostedFileBaseэкземпляров. Еще раз обратите внимание , что аргумент имя совпадает с именем файла , входа.

[HttpPost]
public ActionResult Index(IEnumerable<HttpPostedFileBase> files) {
  foreach (var file in files) {
    if (file.ContentLength > 0) {
      var fileName = Path.GetFileName(file.FileName);
      var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
      file.SaveAs(path);
    }
  }
  return RedirectToAction("Index");
}

На этом все, как видите ничего сложного !

Обновлено: 20.08.2018 — 09:04

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.