Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Во-первых, создадим в проекте папку, в которую будем загружать файлы. Пусть она будет называться Files.
Потом создадим код разметки в представлении, с помощью которого пользователь мог бы загружать файл:
@{ ViewBag.Title = "Upload"; } <h3>Выберите файл для загрузки</h3> @using (Html.BeginForm("Upload", "Home", FormMethod.Post, new {enctype="multipart/form-data"})) { <input type="file" name="upload" /><br> <input type="submit" value="Загрузить" /> }
Хелпер Html.BeginForm
сгенерирует форму. Так как первые два параметра указывают, что форма будет обрабатываться на сервере методом Upload
контроллера HomeController.
Благодаря установке атрибута формы enctype="multipart/form-data"
браузер будет знать, что надо загрузить файл.
Тогда мы можем получить загруженный файл в методе действия Upload
:
[HttpGet] public ActionResult Index() { return View(); } [HttpPost] public ActionResult Upload(HttpPostedFileBase upload) { if(upload!=null) { // получаем имя файла string fileName = System.IO.Path.GetFileName(upload.FileName); // сохраняем файл в папку Files в проекте upload.SaveAs(Server.MapPath("~/Files/" + fileName)); } return RedirectToAction("Index"); }
Переданный с клиента на сервер файл передается через объект HttpPostedFileBase.
С помощью метода SaveAs
мы сохраняем файл по определенному пути на сервере. А помочь определить точный путь для сохранения поможет
метод Server.MapPath()
.
С помощью свойства InputStream
мы можем получить поток файла и манипулировать им как обычными потоками:
//считаем загруженный файл в массив byte[] avatar = new byte[upload.ContentLength]; upload.InputStream.Read(avatar, 0, upload.ContentLength);
При множественной загрузке файлов создаем в представлении набор элементов с типом file
с одинаковым значением атрибута name
:
@using (Html.BeginForm("Upload", "Home", FormMethod.Post, new {enctype="multipart/form-data"})) { <input type="file" name="uploads" /><br> <input type="file" name="uploads" /><br> <input type="file" name="uploads" /><br> <input type="submit" value="Загрузить" /> }
Теперь в метода контроллера мы уже будем получать коллекцию объектов HttpPostedFileBase:
[HttpPost] public ActionResult Upload(IEnumerable<HttpPostedFileBase> uploads) { foreach (var file in uploads) { if(file!=null) { // получаем имя файла string fileName = System.IO.Path.GetFileName(file.FileName); // сохраняем файл в папку Files в проекте file.SaveAs(Server.MapPath("~/Files/" + fileName)); } } return RedirectToAction("Index"); }
Даже если мы все сделаем правильно, мы можем получить ошибку, если попытаемся загрузить файл размером больше 4 МБ. 4 мегабайта - ограничение, действующее на стороне сервера. Однако мы можм его переопределить.
Для этого найдем в файле конфигурации web.config узел httpRuntime
(он вложен в элемент system.web
). Чтобы установить новое
ограничение по размеру, нам надо указать атрибут maxRequestLength
. Например, зададим в качестве нового размера около 20 мегабайт:
<system.web> <compilation debug="true" targetFramework="4.5"/> <httpRuntime targetFramework="4.5" maxRequestLength="20000"/> </system.web>