У меня есть страница, которая позволяет пользователю загружать динамически сгенерированный файл. Для создания требуется много времени, поэтому я бы хотел показать индикатор ожидания. Проблема в том, что я не могу понять, как определить, когда браузер получил файл, поэтому я могу скрыть индикатор.
Я делаю запрос в скрытой форме, которая отправляется на сервер и нацелена на скрытый iframe для его результатов. Поэтому я не заменяю все окно браузера на результат. Я слушаю событие "load" на iframe, в надежде, что оно будет срабатывать, когда загрузка будет завершена.
Я возвращаю заголовок "Content-Disposition: attachment" с файлом, что заставляет браузер отображать диалог "Сохранить". Но браузер не запускает событие "load" в iframe.
Один из подходов, который я пробовал, - это использование многочастного ответа. Таким образом, он отправит пустой HTML файл, а также прикрепленный загружаемый файл. Например:
Content-type: multipart/x-mixed-replace;boundary="abcde"
--abcde
Content-type: text/html
--abcde
Content-type: application/vnd.fdf
Content-Disposition: attachment; filename=foo.fdf
file-content
--abcde
Это работает в Firefox; он получает пустой HTML файл, запускает событие "load" , затем показывает диалоговое окно "Сохранить" для загружаемого файла. Но он не работает на IE и Safari; IE запускает событие "load" , но не загружает файл, и Safari загружает файл (с неправильным именем и типом содержимого) и не запускает событие "load" .
Другой подход может заключаться в том, чтобы позвонить, чтобы начать создание файла, а затем опросить сервер, пока он не будет готов, а затем загрузите уже созданный файл. Но я бы предпочел не создавать временные файлы на сервере.
Есть ли у кого-то лучшее представление?