Привет всем, сегодня рассмотрим примеры того как можно произвести загрузку файла ASP.NET MVC. Полазив в интернете, я обнаружил, много схожего кода, причем очень старого и раздутого. И для этого я покажу свой вариант решения этой задачи.
Загрузка одного файла.
Давайте начнем с просмотром. Вот форма, которая будет отправлять обратно к текущему действию.
1 2 3 4 5 6 7 |
<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».
1 2 3 4 5 6 7 8 9 10 11 |
[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 заменяет, имя аргумента, фаил , одно и то же имя , как имя входного файла. Это важно для модели связующих , чтобы совпадал загруженный файл в методе действия аргумента.
Загрузка нескольких файлов
В этом случае, мы хотим загрузить несколько файлов. Мы можем просто иметь несколько входов для файлов все с тем же именем.
1 2 3 4 5 6 7 8 9 10 |
<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
экземпляров. Еще раз обратите внимание , что аргумент имя совпадает с именем файла , входа.
1 2 3 4 5 6 7 8 9 10 11 |
<span class="na">[HttpPost]</span> <span class="k">public</span> <span class="n">ActionResult</span> <span class="nf">Index</span><span class="p">(</span><span class="n">IEnumerable</span><span class="p"><</span><span class="n">HttpPostedFileBase</span><span class="p">></span> <span class="n">files</span><span class="p">)</span> <span class="p">{</span> <span class="k">foreach</span> <span class="p">(</span><span class="kt">var</span> <span class="n">file</span> <span class="k">in</span> <span class="n">files</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span> <span class="p">(</span><span class="n">file</span><span class="p">.</span><span class="n">ContentLength</span> <span class="p">></span> <span class="m">0</span><span class="p">)</span> <span class="p">{</span> <span class="kt">var</span> <span class="n">fileName</span> <span class="p">=</span> <span class="n">Path</span><span class="p">.</span><span class="nf">GetFileName</span><span class="p">(</span><span class="n">file</span><span class="p">.</span><span class="n">FileName</span><span class="p">);</span> <span class="kt">var</span> <span class="n">path</span> <span class="p">=</span> <span class="n">Path</span><span class="p">.</span><span class="nf">Combine</span><span class="p">(</span><span class="n">Server</span><span class="p">.</span><span class="nf">MapPath</span><span class="p">(</span><span class="s">"~/App_Data/uploads"</span><span class="p">),</span> <span class="n">fileName</span><span class="p">);</span> <span class="n">file</span><span class="p">.</span><span class="nf">SaveAs</span><span class="p">(</span><span class="n">path</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="k">return</span> <span class="nf">RedirectToAction</span><span class="p">(</span><span class="s">"Index"</span><span class="p">);</span> <span class="p">}</span> |
На этом все, как видите ничего сложного !