Во-первых, создадим в проекте папку, в которую будем загружать файлы. Пусть она будет называться Files.
Потом создадим код разметки в представлении, с помощью которого пользователь мог бы загружать файл:
Хелпер Html.BeginForm сгенерирует форму. Так как первые два параметра указывают, что форма будет обрабатываться на сервере методом Upload контроллера HomeController.
Благодаря установке атрибута формы enctype=»multipart/form-data» браузер будет знать, что надо загрузить файл.
Тогда мы можем получить загруженный файл в методе действия Upload :
Переданный с клиента на сервер файл передается через объект HttpPostedFileBase .
С помощью метода SaveAs мы сохраняем файл по определенному пути на сервере. А помочь определить точный путь для сохранения поможет метод Server.MapPath() .
С помощью свойства InputStream мы можем получить поток файла и манипулировать им как обычными потоками:
Содержание
- Множественная загрузка файлов
- Ограничение размера файлов
- Прием файлов на стороне сервера.
- Поддержка браузеров.
Множественная загрузка файлов
При множественной загрузке файлов создаем в представлении набор элементов с типом file с одинаковым значением атрибута name :
Теперь в метода контроллера мы уже будем получать коллекцию объектов HttpPostedFileBase:
Ограничение размера файлов
Даже если мы все сделаем правильно, мы можем получить ошибку, если попытаемся загрузить файл размером больше 4 МБ. 4 мегабайта — ограничение, действующее на стороне сервера. Однако мы можм его переопределить.
| Воскресенье, 17 февраля, 2013
В прежних версиях HTML не было возможности загружать на сайт сразу несколько файлов, для этого нужно было использовать сторонние компоненты, написанные на Flash, Silverlight и т.п., которые позволяли выводить диалоговое окно выбора нескольких файлов.
В HTML5 элемент input получил новый атрибут multiple, а с ним и новую возможность выбирать в диалоге сразу несколько файлов. Кроме того, для выбора файлов только определенного типа, введен еще один новый атрибут accept, который распознает MIME media types (стандарт описывающий передачу различных типов данных в интернете).
Но нужно пояснить, что множественная загрузка HTML5 позволяет отправлять на сервер сразу несколько файлов, но сам процесс отправки не сильно изменился. Пока еще нет возможности показа состояния загрузки и других подобных вещей, которые бы автоматически делали загрузку удобнее, без использования дополнительных библиотек или написания вспомогательного кода.
В HTML5 так может выглядеть код разметки для отправки файлов на сервер:
После нажатия на кнопку выбора файлов появится диалоговое окно, в котором можно выбрать сразу несколько файлов и загрузить их одним кликом.
Прием файлов на стороне сервера.
Когда файлы загружаются на сервер c ASP.NET MVC, то нужно помнить о следующих вещах. Если загрузка идет из одного элемента input, то файлам присваивается одно и то же имя. То есть нельзя получить файл по имени управляющего элемента input.
Вместо этого можно выбрать все ключи файлов и через них же запрашивать файлы в виде HttpPostedFileBase.
Либо можно сделать еще проще, используя параметр в action-методе.
Поддержка браузеров.
Множественная загрузка — полезная функция, но она не поддерживается всеми браузерами. Как эту проблему решить? Можно добавить несколько контролов загрузки по одному файлу и дать возможность выбирать пользователю каждый файл по отдельности. Это не идеальное решение, но таким образом у пользователей хотя бы будет возможность загружать файлы на сайт, в противном случае контрол множественной загрузки просто проигнорируется.
Атрибут multiple поддерживается в Internet Explorer 10 +, Firefox 3.6 +, Opera 11.0 +, Chrome 2.0 + и Safari.
Контролер всегда получает image = null. В чем может быть проблема?
- Вопрос задан более трёх лет назад
- 14523 просмотра
Ошибки во всех трех местах 🙂
1. В форме добавить аттрибут name для контрола
2. Код в контроллере
3. В принципе без cкрипта можно и обойтись, все отправится и так, по нажатию на кнопку. Но если уж используется jQuery то вполне достаточно следующего:
Ошибки есть. Вьюшку и контроллер немного надо изменить
вью:
Источник: