Я хочу предоставить индикатор выполнения для моих пользователей, которые загружают очень большие файлы. Я немного почитал и реализовал то, что должно быть довольно простым решением:
- У меня есть элемент
<form>
, который содержит элемент ввода файла; target
имеет идентификатор скрытого iframe.
- На стороне сервера есть некоторая магия Spring, которая присоединяет объект к сеансу пользователя; Ход загрузки может быть запрошен из этого объекта.
- После отправки формы я запускаю повторяющийся Ajax-вызов, используя
setInterval
, который запрашивает у сервера завершенный процент с использованием вышеупомянутого объекта сеанса. Вызов повторяется каждые полсекунды, пропуская вызов Ajax, если предыдущий вызов еще не завершен. Я использую данные звонка для обновления width
экранного элемента. Когда серверный вызов сообщает, что загрузка завершена, я очищаю интервальный таймер.
Я создал 100-мегабайтный файл и загрузил его, используя мой интерфейс. Это использует Firefox 3.6.3. Я обнаружил, что, хотя загрузка занимает 20-25 секунд, индикатор выполнения не обновляется до самого конца. Кроме того, весь браузер в основном заморожен до завершения загрузки.
Я предполагал, что мой метод должен быть ошибочным, но я пробовал ту же самую страницу, используя IE6, и был совершенно поражен, когда она вела себя так, как я ее разработал - индикатор выполнения обновлялся каждые полсекунды, и только вся загрузка заняло около 15 секунд, намного быстрее, чем Firefox.
У меня не установлено много надстроек, но я попытался отключить Firebug и перезапустить браузер. Это незначительно улучшило производительность - возможно, я получил еще одно обновление индикатора выполнения в середине загрузки - но все еще далеко от приемлемого.
Может кто-нибудь сказать мне, что я могу сделать, чтобы довести производительность Firefox до уровня IE6? Тьфу, я не могу поверить, что я действительно напечатал это.
EDIT:
Я только что попытался загрузить большой файл из браузера Firefox 3.6.3 на другой компьютер, чем тот, на котором работает мой веб-сервер, и он работал нормально. Да.