Sunday, September 05, 2010

Silverlight + nginx = возобновляемая загрузка файлов в браузере

В данной статье рассматривается опыт внедрения Silverlight-клиента для организации возобновляемой загрузки файлов на проекте Файлы@Mail.Ru.
Зачем это нужно? Думаю, не нужно рассказывать, что загрузку файлов на сервер и их хранение сейчас предоставляет очень большое количество веб-проектов, от небольших до очень крупных. Причем загрузка обычно реализована в виде обычного <input type=file/>, реже — с помощью Flash, еще реже — иными средствами (загрузку по FTP в данной статье мы не рассматриваем).
Проблема состоит в том, что протокол HTTP изначально текстовый и для передачи больших объемов бинарных данных не очень приспособлен. Отсюда вытекает, что при обрыве связи у пользователя, перезагрузке компьютера и тому подобных факапах наполовину переданный файл приходится начинать загружать заново, а в случае с медленным каналом это превращается в настоящее издевательство.
Что делать?
Как мы дошли до такой жизни
Появление первых слухов о новой версии Adobe Flash 10 с поддержкой метода FileReference.load() для чтения содержимого файла нас воодушевило. Но не тут-то было: Adobe всех «перехитрил». Метод FileReference.load() полностью загружает все содержимое файла в память компьютера, тем самым «подвешивая» машину при попытке прочитать большой файл (в экспериментах «большим» уже оказывался файл примерно 500 МБ на компьютере с 2ГБ ОЗУ). Кроме того, Flash не поддерживает файлы размером более 2ГБ.
Мы были опечалены и разочарованы. К тому же насущно требовалась поддержка частичной загрузки с серверной стороны, а делать её самим было лень.
И вот однажды мы подумали: «А давайте посмотрим на Silverlight, может он нам даcт нечто большее, чем Flash?» — и не ошиблись.
В Silverlight работа с файлами реализована более грамотно и доступно, чем в Flash — мы можем читать выбранный пользователем в диалоге файл по произвольному смещению буферами произвольного размера. При этом размер файла в Silverlight ограничен 64-битным числом, т.е. мы можем загружать файлы практически бесконечного размера (теоретически до 16 384 ПБ).
К тому же, в репозитории Валерия Холодкова (если вдруг кто-то не знает, то это автор отличного модуля nginx_upload_module для загрузки файлов) появилась и неспешно развивалась ветка, называющаяся partial-upload, одно название которой приводило нас в благоговейный трепет.
Read more: Habrahabr.ru