У меня есть страница, которая позволяет пользователю загружать динамически генерируемый файл. Генерирование занимает много времени, поэтому я хотел бы показать индикатор «ожидания». Проблема в том, что я не могу понять, как определить, когда браузер получил файл, поэтому я могу скрыть индикатор.
Я делаю запрос в скрытой форме, которая отправляет на сервер и нацеливает скрытый iframe для его результатов. Поэтому я не заменяю все окно браузера результатом. Я слушаю событие загрузки в iframe, в надежде, что оно сработает после завершения загрузки.
Я возвращаю заголовок «Content-Disposition: attachment» вместе с файлом, в результате чего браузер отображает диалоговое окно «Save». Но браузер не запускает событие загрузки в 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», а затем показывает диалоговое окно «Save» для загружаемого файла. Но это не работает в IE и Safari; IE запускает событие «load», но не загружает файл, а Safari загружает файл (с неправильным именем и типом содержимого) и не запускает событие «load».
Другой подход может заключаться в том, чтобы позвонить, чтобы начать создание файла, затем опросить сервер, пока он не будет готов, а затем загрузить уже созданный файл. Но я бы предпочел не создавать временные файлы на сервере.
У кого-нибудь есть идея получше?