Pull to refresh

Comments 24

А почему AppDomain.CurrentDomain.BaseDirectory + «UploadedFiles/», а не Server.MapPath("~/UploadedFiles")?
Лично у меня были ситуации, когда определенные задания запускались по таймеру (к примеру — массовая рассылка писем, и подгрузка аттачей/шаблона тела письма с файла на сервере). В эти моменты System.Web.HttpContext.Current равен null, а значит и Server недоступен.

К примеру Server.MapPath заменялось на System.Web.Hosting.HostingEnvironment.MapPath в моих задачах.

Вероятно AppDomain.CurrentDomain.BaseDirectory тут используется по той же причине
Задание запускалось в рамках web-приложения?
Присоединяюсь к предыдущему вопросу и дополнил бы что

string path = AppDomain.CurrentDomain.BaseDirectory + «UploadedFiles/»;

лучше бы вынести за пределы цикла. Конечно в данном случае это микрооптимизация, но лучше на такие вещи обращать внимание, иначе можно как то запихнуть в цикл что то более ресурсоемкое и не заметить.
Ну, возможно, в топике так с целью простоты примера, так то в контроллерах вообще надо избегать таких dependency как AppDomain.
Ну тогда уж Path.Combine(...) =)
Ну это уж совсем, конечно, для чайников.

Но есть пара замечаний:

при формировании формы с несколькими элементами загрузки файлов необходимо формировать имена элементов (атрибуты name) с индексаторами [№].


достаточно просто name=«someField[]»

про Server.MapPath уже сказали, добалю, что лично я использую также не конкатенацию строк, а String.Format, получается более изящно и гибко

ну и public ActionResult Index(IEnumerable fileUpload) избыточно, на мой взгляд. доступ к файлам можно получить из Request.Files
ой, простите, во-первых «добавлю», а во-вторых, забыл закрыть тег.
Не согласен насчёт избыточности, тестировать гораздо проще.
В этом плане согласен.
«public ActionResult Index(IEnumerable fileUpload)»

Хех, мало того, на практике еще и

public object UploadFile(FileUploadModel model)

Никакого доступа к Request.Files — для этого есть ModelBinder, и это не должно быть в контроллере.
А мне интересно, как такой код можно протестировать?
код сохранения переданных на вход файлов?
можно протестировать их наличием на диске и совпадением CRC после выполнения метода
Ммм тогда будет тестироваться SaveAs, плюс это будет даже не юнит-тест.
Такой? Да никак :) Чего стоит могучий AppDomain в методе контроллера.
Ну SaveAs абстрагируем (тем более что хранилище в любом случае стоит абстрагировать) — и ура.
Вообще сама задача загрузки файлов не настолько тривиальна, практически всегда требуется сделать одновременную загрузку нескольких файлов произвольного размера и progress bar.
<зануда>Не назвал бы приведенный подход «элегатным»<зануда/>
А вот вопрос, вы делаете file.SaveAs(Path.Combine(path, filename)), т.е. имя файла берется из загружаемого файла и если такой файл на сервере уже есть, он будет перезаписан? или MVC3 обеспечивает уникальные имена?
тогда может стоит отметить этот факт раз статья для начинающих? в данном виде код не безопасный
Еще можно добавить, что для IIS 7 при конфигурировании максимального размера для загружаемых файлов надо настроить не только maxRequestLength, но и
<system.webServer>
   <security>
      <requestFiltering>
         <!--ограничение на размер запроса в байтах-->
            <requestLimits maxAllowedContentLength="10000000"&gh;</requestLimits>


А также, при сохранении файла надо еще пару тривиальных проверок сделать:
1. На тип файла. Не хотите же, чтобы на сервер загружали .aspx файлы :).
2. На разрешенные символы в имени файла. И заменить недопустимые.

И спасибо за [№], не знал, что так можно.
1. А может мы хотим, чтобы .aspx файлы загружали? Что такого-то… главное, права на исполнение убрать для папки закачек. )
Тогда права на чтение надо убирать :)
.aspx файл не исполняется сам. Его асп.нет рантайм исполняет, ему надо только прочитать содержимое файла. А без прав на чтение нельзя будет и обыный текстовый файл или картинку, например, считать.
вы правы насчет maxAllowedContentLength, однако, по умолчанию значение атрибута равно 30000000, то есть ~28 мегабайт, следовательно ваш пример с 10 мегабайтами излишен :-)

но спасибо за дополнение, это действительно важно и полезно…

* да, комментарии на Хабре не менее важны, чем сама статья
Sign up to leave a comment.

Articles