воскресенье, 15 ноября 2009 г.

Делаем файлообменник [2: Индикатор загрузки]

Итак, на странице есть форма с полем для выбора файла.

Если просто отправить эту форму, то браузер попытается вывести результаты, т.е. перезагрузит страницу. А нам она нужна для вывода индикатора загрузки. Поэтому нужно чтобы результаты отправки приходили не в текущее окно. Вообще говоря, результаты загрузки нам совсем не нужны, так что мы перенаправим их в невидимый фрейм.

  • Делаем на странице невидимый фрейм
  • Для формы устанавливаем target="имя_невидимого_фрейма"
Теперь при отправке формы страница не перезагружается. И, кстати, во время отправки форма нам тоже уже не нужна, а точнее, поле выбора файла и кнопка отправки.
  • При отправке скрываем поле выбора файла и кнопку отправки
Для индикатора загрузки возможны варианты: а) переодически опрашивать состояние загрузки файла, б) открыть соединение, в которое сервер будет переодически скидывать состояние. Выберем вариант "а" - он проще в исполнении.

Организуем переодические запросы к серверу, возвращающие состояние загрузки. Какие именно данные входят в состояние загрузки? Минимум: размер файла, размер загруженной части, код состояния (ок, ошибка, что-то ещё).

Как именно получить эти данные, зависит от реализации загрузки. Один из вариантов такой: Принимающий скрипт после приёма каждой порции данных складывает данные состояния загрузки в известное место - строку БД или файл, по ID загрузки. Так как ID загрузки должен быть известен на клиенте, то и формировать его будет тоже клиент (например, с помощью Math.random()). Нужно добавить его скрытым полем в форму отправки файла и в запрос состояния. Что получилось.
  • Перед отправкой файла формируем ID загрузки и добавляем поле в форму отправки
  • Принимающий скрипт после приёма каждой порции сохраняет данные состояния загрузки (куда-нибудь), с идентификатором ID загрузки.
  • Со страницы идут AJAX запросы состояния (с ID загрузки) каждые 2-4 сек.
  • При получении данных о состоянии загрузки, на странице обновляется индикатор загрузки.
Индикатор может быть простой строкой "Загружено XX из XXX Кб" или "графическим" - можно пропорционально изменять ширину div'а, к примеру.
Осталось только по окончании загрузки сохранить в БД информацию о сохранённом файле
  • После приёма последней порции файла, информация о нём сохраняется в БД.
  • В состояние загрузки записывается "ОК"
  • После приёма на клиенте состояния "ОК" выключаем опрос состояния, скрываем индикатор загрузки и показываем пользователю "Приём файла завершён успешно".
В следующий раз рассмотрим отправку адресату ссылки для скачивания файла.

4 коммент.:

lelik17 комментирует...

интересно. ещё бы код посмотреть =)

Taygius комментирует...

присоединяюсь... код выложишь??

Анонимный комментирует...

А не лучше ли воспользоваться флешем для данной задачи?

п.с. Написал тебе по картинкохостингу, куда ты говорил, еще пару дней назад.

Горбачёв комментирует...

Насчёт выкладывания кода ещё не решил:) С одной стороны, поделиться хочется, а с другой, чтобы уж совсем нахаляву не было. Но это не значит что скрипт будет продаваться, скорее всего будет свободно распространяться урезанная версия (без каких-нибудь наворотов).

Флешем удобней, наверное, но я на нём совсем не програмлю. Послание твоё получил, напишу сегодня на почту.