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

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 13.09.2014

Во-первых, создадим в проекте папку, в которую будем загружать файлы. Пусть она будет называться 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>
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850