Как я и обещал в прошлой заметке, продолжу рассказ про свою работу с
jUpload.
Выбор технологии
Сначала о том, почему надо было выбирать именно решение, основанное на Java-апплете. Задача стояла так: пользователь должен иметь возможность выбрать папку на своём компьютере (например, с фотографиями, сделанными на прошедшей вечеринке), нажать какую-нибудь волшебную кнопочку типа «Upload all selected files» — и выбранные фото должны закачаться на сайт.
Стандартные html-ные file-input не подходили сразу же. Во-первых, они требуют выборки конкретного файла, во-вторых, не всегда (зависит от браузера) запоминают расположение папки, из которой был выбран предыдущий файл, в-третьих, не позволяют (по умолчанию) включать режим предпросмотра (preview). Безусловно, вместо preview можно включить опцию «Показывать файлы как эскизы», но как показала практика, бОльшая часть пользователей об этом не знает либо же не пользуется этой опцией.
Да и мало кто из пользователей будет иметь достаточно выдержки, чтобы указать 40 файлов, идущих по порядку — по одному файлу за клик. Особенно если файлы имеют название вроде DSN6578.JPG. Тут легко и ошибиться.
Соответственно, стало ясно, что надо пользоваться какими-то более расширенными (по сравнению со стандартными) решениями.
Первой же в голову пришла мысль использовать flash. Да, действительно, подержка flash сейчас есть в браузерах большинства пользователей.
Но к сожалению, flash не позволяет выбирать целые папки с файлами. да, с помощью flash можно сделать достаточное продвинутое окно диалога по выбору файла, например, с выбором файлов по маске, т.е. не «*.*», а, например, «*.jpg; *.gif; *.png» (кстати, ссылка по теме —
swfupload.org, неплохое flash-решение для улучшения стандартного html file input, есть примеры по работе с ASP.NET, PHP и другими серверными технологиями). Но пользователю всё равно придётся выбирать каждый файл отдельно. Не совсем то, что было нужно мне для текущей задачи.
Кроме перечисленных, я рассматривал (правда, чисто теоретически) вариант с плагинами для браузеров. Вы вполне могли с таким встречаться, к примеру, на сервисе Яндекс.Фотки. Там точно так же выбираются фотографии, как нужно было и мне — хоть по файлу, хоть целой папкой, с предпросмотром картинок. Но основная тонкость тут вот в чем — чтобы получить весь этот функционал, надо установить плагин для браузера.
А это целое дело. Даже со стороны пользователя это непросто. Надо скачать плагин, решиться на его установку (а ведь не каждый на это решится — кто-то не доверяет, у кого-то и так плагинов много), скачать, установить и перезапустить браузер.
А основных браузеров (пускай даже только под Windows) у нас сколько? IE 6,7, 8, Mozilla Firefox, Opera, Safari, Google Chrome. Как видим, семь. И это без учета разных версий Firefox (плагины в котором тоже не всегда совместимы в разных версиях браузеров). А ведь в Опере, насколько я знаю, плагины так просто не применить.
В общем, этот путь тоже был отброшен ввиду своей сложности.
И таким вот детальным методом перебора я пришел к выводу, что лучше всего использовать Java-апплеты. Тем более, на крупных всемирных социальных сетях (MySpace, Facebook) тоже используются подобные загрузчики, основанные на Java. Кстати, Java — мультиплатформенная.
Конечно, это не самый идеальный вариант, ведь у пользователя на компьютере должна быть установлена Java-машина (Java Runtime Environment, JRE). Я решил проверить, просто ли будет простому пользователю установить у себя на компьютере JRE. Для этого я удалил ту версию JRE (кстати, уже немного устаревшую) со своего лэптопа и зашел на
www.java.com, чтобы скачать новую версию Java. Меня попросили проверить, какая версия Java установлена у меня сейчас, потом страница о чем-то «подумала» и попросила меня скачать более новую версию. Скачал дистрибутив на 300 килобайт, запустил, он слазил в интернет, чего-то с java.com вытащил и установил. Я потом посмотрел в папку Program Files/Java, там было 72 мегабайта. Мне кажется, он столько с java.com не утащил, потому что таскал данные он всего несколько минут, а скорость у меня полмегабита.
Так что из этого я сделал вывод,что пользователи с выделенными линиями без особых проблем смогут установить себе JRE. Ну а пользователи без выделенных линий могут и не пробовать, ведь на странице массового загрузчика фотографий сам апплет (подробнее о нём — позже) весит около полумегабайта, да и фотографии с диалапа пачками особенно не закачаешь. Впрочем, людей с выделенными линиями сейчас всё больше, а владельцев диалапов всё меньше, что не может не радовать.
Здравствуй, jUpload, великий и могучий!
Вообще, в сети есть масса Java-апплетов, написанных именно для тех целей, которые мне и были нужны. Зачасту с ними были примеры и решения по работе с ASP.NET. Но у большинства из них есть один, но существенный, недостаток. Они платные. А мне, во-первых, совсем не хотелось платить, а во-вторых, даже если бы я и захотел заплатить, сделать это было бы совсем не просто, ведь живу-то я не в Америке.
И какие не смотрел, ASPUpload, PowUpload или прочие — все платные. Разброс цен очень большой — от $20 до $800. Я уж было совсем приуныл. Но вот тут я нашел jUpload. Знакомьтесь, герой моего сегодняшнего повествования,
jUpload, великий и могучий, а также бесплатный для non-commercial использования.
Посмотрите на Live Demo последней версии (0.90):
www.jupload.biz/demo/0.90/index-demo.html. В демо-версии файлы закачиваются, но не сохраняются на сервере.
В комплекте с jUpload идет большое число примеров, а также несколько вариантов настроек апплета под конкретные цели.
Обратите внимание на несколько параметров конфигурационного файла: Upload.Http.MaxRequestSize (максимальный размер всех выбранных файлов) и Files.MaxImageSize (максимальный размер одного файла). Значения в них выставлены в байтах.
Не забудьте, что при работе с ASP.NET приложением надо увеличить параметр httpRuntime в секции system.web файла web.config.
(пример: <httpRuntime maxRequestLength="20480" /> — лимит суммарного размера обрабатываемых файлов в 20 мегабайт), иначе ваше веб-приложение не сможет обрабатывать файлы более-менее существенного размера.
И обратите внимание вот на что. В jUpload все конфигурационные файлы имеют название вида jupload.default.config. Если вы попробуете развернуть готовый пример в своем приложении, это не получится, потому что при попытке обратиться из апллета к файлу с расширением .config (вы же помните про корневой Web.config?) будет отказано в доступе.
Просто переименуйте jupload.default.config в jupload.default.config.cfg, например, и все нормально заработает.
И обратите внимание на параметр Upload.URL.Action файла конфигурации jUpload-a. Та страница (файл, скрипт), которая прописана в этом параметре, вызывается через сокет, потому все данные об авторизованности пользователя, само собой, недоступны.
Я решил эту проблему путем передачи в апплет некоего секретного ключа, который у каждого пользователя свой. С его помощью я могу идентифицировать, что за пользователь пытается закачать фото, и может ли он вообще их закачивать.
И вот ещё тонкий момент. Если вы хотите вызвать Upload.URL.Action с некими GET-параметрами, их нужно прописывать не в Upload.URL.Action, как того хочется интуитивно (например, «/upload.aspx?a=1»), а в Upload.Http.Query (например, «Upload.Http.Query=a=1,b=2» равносильно передаче uploader.aspx через строку запроса «?a=1&b=2»).
Руководство к jUpload
На сайту jupload.biz есть
online-manual, есть и версия для загрузки. Надо отметить, что давно я не встречал настолько хороших мануалов, в особенности если говорить про open-source продукты. После работы с продукцией Microsoft привыкаешь, что есть MSDN, Books Online и в них всегда можно найти то, что нужно. И когда в других продуктах такого нету, это раздражает и вызывает определённый дискомфорт.
Разработчики jUpload написали очень серьёзный мануал, в нём есть ответы на подавляющую часть вопросов, которые могут возникнуть при работу с jUpload. При работе и настройке аплоадера я пользовался в основном этим документом. За что разработчикам и большое спасибо.
Мораль
jUpload — очень хорошее решение, при необходимости использовать массовый загрузчик файлов с использованием Java-технологий я рекомендовал бы обратить внимание именно на него.
И напоследок
Достаточно интересно получилось. В веб-проекте, основанном на одной технологии (ASP.NET), используется решение на принципиально другой, кроме того, конкурирующей, технологии (Java). Вот вам и mashup, как это любят говорить применительно к web2.0-проектам.
Конечно, если бы была возможность, я бы использовал Microsoft
Silverlight, но пока что он не настолько распространён (т.е. Java установлена у бОльшего числа пользователей, хотя установить Silverlight plugin совсем не сложно, да и весит он куда уж меньше Java — примерно как flash plugin, мегабайт с копейками), да и готовых подобных решений (а особенно бесплатных) на Silverlight я не встречал. Потому использую то, что есть. Тем более, то, что есть, отлично работает и подходит для моих целей.