Нещодавно довелося реалізовувати можливість вивантаження (upload) на сервер файлів великого розміру і видачі (download) цього файлу користувачеві. Робити це вирішив за допомогою HttpHandler. Сам принцип при використанні IHttpHandler дуже просто, але є деякі нюанси.
Вибір типу повідомлення
Коли ви видаєте користувачеві файл для завантаження, йому показується діалогове вікно. Вікно має кнопки "Відкрити", "Зберегти" і "Скасувати". Якщо ви хочете щоб замість цих кнопок був інший діалог "Зберегти", слід використовувати:
А який ContentType?
У процесі формування відповіді від сервера, не важливо в якому контексті Web API, HttpHandler, HttpModule або навіть простий ActionResult, або навіть WebForms, обов'язково треба вказувати тип повертається змісту. Пропоную вам на допомогу допоміжну функцію.
На мій погляд, цей метод може заощадити вам не мало часу, благо, що і сам частенько ним користуюся.
приклад використання
На простому прикладі покажу, як можна використовувати вказаний метод. Припустимо у мене проект WebForms. На одній якійсь сторінці видається файл (word.doc) для завантаження. Нехай в методі Page_Load викликається моя приватна процедура DownloadFile ():
У рядку 10 як раз і викликається наведений в допомогу метод, який по розширенню встановлює "правильний" тип повертається контенту.
Response.TransmitFile () vs Response.WriteFile ()
Пару слів про рядок 12 попереднього лістингу. Існує два способи "віддати" користувачеві файл. Вам вибирати який використовувати.
TransmitFile () - метод відправляє файл на клієнт без завантаження цього файлу в пам'ять сервера (application memory). Це більш правильне рішення для завантаження файлів великого розміру.
WriteFile () - метод завантажує файл в пам'ять сервера перед тим як відправити його клієнту. Цей метод більш кращий при загружзе маленьких і середніх за розміром файлів.
З вивантаженням файлів великого розміру немає нічого складного. Щоб не бути голослівним наведу приклад завантаження файлів, а точніше картинок на сервер. Я використовував цей HttpHandler для вивантаження на сервер картинок з Silverlight-додатків.
Таким чином, виходить в 14 рядку клієнту "йдеться", що частина файлу успішно збережена і це означає, що можна відправляти наступний.
Єдине, що треба згадати, так це те, що максимально допустимий розмір файлу для завантаження на сервер можна встановити в файлі конфігурації (web.config):
А якщо бути до кінця чесним, то зараз існує величезна кількість безкоштовних компонентів і контролів сторонніх розробників, які максимально просто і допомагають вирішити дану проблему. Наприклад, AjaxControlToolkit.
Ну в тому то й справа, що за допомогою asp.net безпосередньо (без попередньої фрагментації і її обробки), великий файл на сервер не зальyoш, тоді як інші (тобто що не аспнет :)) це дозволяють, на Ютюб на мою було можна просто за допомогою бравзера залити великий файл. да я розумію недоліки - що якщо в кінці з'єднання навернётся, то виконувати заново і т.д. - але все ж.
Тому варіант токо юзати сторонні Натів модулі до iis, які дозволяють обробляти вхідний потік не заганяючи його в пам'ять
Якщо не правий поправте.
Knockout: Створюємо поле з авто підстановкою або Autocomplete on knockoutjs