Comments 24
А почему AppDomain.CurrentDomain.BaseDirectory + «UploadedFiles/», а не Server.MapPath("~/UploadedFiles")?
+10
Лично у меня были ситуации, когда определенные задания запускались по таймеру (к примеру — массовая рассылка писем, и подгрузка аттачей/шаблона тела письма с файла на сервере). В эти моменты System.Web.HttpContext.Current равен null, а значит и Server недоступен.
К примеру Server.MapPath заменялось на System.Web.Hosting.HostingEnvironment.MapPath в моих задачах.
Вероятно AppDomain.CurrentDomain.BaseDirectory тут используется по той же причине
К примеру Server.MapPath заменялось на System.Web.Hosting.HostingEnvironment.MapPath в моих задачах.
Вероятно AppDomain.CurrentDomain.BaseDirectory тут используется по той же причине
0
Присоединяюсь к предыдущему вопросу и дополнил бы что
string path = AppDomain.CurrentDomain.BaseDirectory + «UploadedFiles/»;
лучше бы вынести за пределы цикла. Конечно в данном случае это микрооптимизация, но лучше на такие вещи обращать внимание, иначе можно как то запихнуть в цикл что то более ресурсоемкое и не заметить.
string path = AppDomain.CurrentDomain.BaseDirectory + «UploadedFiles/»;
лучше бы вынести за пределы цикла. Конечно в данном случае это микрооптимизация, но лучше на такие вещи обращать внимание, иначе можно как то запихнуть в цикл что то более ресурсоемкое и не заметить.
+2
Ну это уж совсем, конечно, для чайников.
Но есть пара замечаний:
достаточно просто name=«someField[]»
про Server.MapPath уже сказали, добалю, что лично я использую также не конкатенацию строк, а String.Format, получается более изящно и гибко
ну и public ActionResult Index(IEnumerable fileUpload) избыточно, на мой взгляд. доступ к файлам можно получить из Request.Files
Но есть пара замечаний:
при формировании формы с несколькими элементами загрузки файлов необходимо формировать имена элементов (атрибуты name) с индексаторами [№].
достаточно просто name=«someField[]»
про Server.MapPath уже сказали, добалю, что лично я использую также не конкатенацию строк, а String.Format, получается более изящно и гибко
ну и public ActionResult Index(IEnumerable fileUpload) избыточно, на мой взгляд. доступ к файлам можно получить из Request.Files
0
ой, простите, во-первых «добавлю», а во-вторых, забыл закрыть тег.
0
Не согласен насчёт избыточности, тестировать гораздо проще.
0
«public ActionResult Index(IEnumerable fileUpload)»
Хех, мало того, на практике еще и
public object UploadFile(FileUploadModel model)
Никакого доступа к Request.Files — для этого есть ModelBinder, и это не должно быть в контроллере.
Хех, мало того, на практике еще и
public object UploadFile(FileUploadModel model)
Никакого доступа к Request.Files — для этого есть ModelBinder, и это не должно быть в контроллере.
+1
А мне интересно, как такой код можно протестировать?
0
код сохранения переданных на вход файлов?
можно протестировать их наличием на диске и совпадением CRC после выполнения метода
можно протестировать их наличием на диске и совпадением CRC после выполнения метода
0
Такой? Да никак :) Чего стоит могучий AppDomain в методе контроллера.
+1
Ну SaveAs абстрагируем (тем более что хранилище в любом случае стоит абстрагировать) — и ура.
0
Вообще сама задача загрузки файлов не настолько тривиальна, практически всегда требуется сделать одновременную загрузку нескольких файлов произвольного размера и progress bar.
<зануда>Не назвал бы приведенный подход «элегатным»<зануда/>
<зануда>Не назвал бы приведенный подход «элегатным»<зануда/>
0
А вот вопрос, вы делаете file.SaveAs(Path.Combine(path, filename)), т.е. имя файла берется из загружаемого файла и если такой файл на сервере уже есть, он будет перезаписан? или MVC3 обеспечивает уникальные имена?
0
Еще можно добавить, что для IIS 7 при конфигурировании максимального размера для загружаемых файлов надо настроить не только maxRequestLength, но и
А также, при сохранении файла надо еще пару тривиальных проверок сделать:
1. На тип файла. Не хотите же, чтобы на сервер загружали .aspx файлы :).
2. На разрешенные символы в имени файла. И заменить недопустимые.
И спасибо за [№], не знал, что так можно.
<system.webServer>
<security>
<requestFiltering>
<!--ограничение на размер запроса в байтах-->
<requestLimits maxAllowedContentLength="10000000"&gh;</requestLimits>
А также, при сохранении файла надо еще пару тривиальных проверок сделать:
1. На тип файла. Не хотите же, чтобы на сервер загружали .aspx файлы :).
2. На разрешенные символы в имени файла. И заменить недопустимые.
И спасибо за [№], не знал, что так можно.
+1
1. А может мы хотим, чтобы .aspx файлы загружали? Что такого-то… главное, права на исполнение убрать для папки закачек. )
0
вы правы насчет maxAllowedContentLength, однако, по умолчанию значение атрибута равно 30000000, то есть ~28 мегабайт, следовательно ваш пример с 10 мегабайтами излишен :-)
но спасибо за дополнение, это действительно важно и полезно…
* да, комментарии на Хабре не менее важны, чем сама статья
но спасибо за дополнение, это действительно важно и полезно…
* да, комментарии на Хабре не менее важны, чем сама статья
+1
Only those users with full accounts are able to leave comments. Log in, please.
ASP.NET MVC 3 для начинающих: загрузка файлов на сервер