Привет всем, сегодня рассмотрим примеры того как можно произвести загрузку файла 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");
}
На этом все, как видите ничего сложного !