У меня есть страница, которая позволяет пользователю загружать динамически сгенерированный файл. Для создания требуется много времени, поэтому я бы хотел показать индикатор ожидания. Проблема в том, что я не могу понять, как определить, когда браузер получил файл, поэтому я могу скрыть индикатор.Обнаруживать, когда браузер получает загрузку файла
Я делаю запрос в скрытой форме, которая отправляется на сервер и нацелена на скрытый 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».
Другой подход может заключаться в том, чтобы позвонить, чтобы начать создание файла, а затем опросить сервер, пока он не будет готов, а затем загрузите уже созданный файл. Но я бы предпочел не создавать временные файлы на сервере.
У кого-нибудь есть идея?
Нет версии IE поддерживает многокомпонентные/х-смешанных заменить. – EricLaw
Спасибо Эрик - это хорошо знать. Я больше не буду тратить время на этот подход. –
Только надежный способ, похоже, является уведомлением о push-сервере (SignalR для людей ASP.NET). – dudeNumber4