Wykryj, kiedy przeglądarka pobiera plik

Mam stronę, która pozwala użytkownikowi pobrać plik generowany dynamicznie. Generowanie zajmuje dużo czasu, więc chcę pokazać wskaźnik „czekania”. Problem polega na tym, że nie wiem, jak wykryć, kiedy przeglądarka otrzymała plik, więc mogę ukryć wskaźnik.

Zgłaszam żądanie w ukrytej formie, która POST na serwerze i kieruje ukryte iframe na wyniki. Tak więc nie zastępuję całego okna przeglądarki wynikiem. Słucham zdarzenia „ładuj” w iframe, w nadziei, że zostanie ono uruchomione po zakończeniu pobierania.

Zwracam nagłówek „Content-Disposition: attachment” wraz z plikiem, co powoduje, że przeglądarka wyświetla okno dialogowe „Zapisz”. Ale przeglądarka nie uruchamia zdarzenia „ładuj” w elemencie iframe.

Jedno podejście próbowałem użyć odpowiedzi wieloczęściowej. Wysłałby więc pusty plik HTML, a także załączony plik do pobrania. Na przykład:

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

Działa to w Firefoksie; odbiera pusty plik HTML, uruchamia zdarzenie „load”, a następnie wyświetla okno dialogowe „Save” dla pliku do pobrania. Ale nie działa na IE i Safari; IE uruchamia zdarzenie „load”, ale nie pobiera pliku, a Safari pobiera plik (o niewłaściwej nazwie i typie zawartości) i nie uruchamia zdarzenia „load”.

Innym podejściem może być wywołanie, aby rozpocząć tworzenie pliku, a następnie sondować serwer, dopóki nie będzie gotowy, a następnie pobrać już utworzony plik. Ale wolałbym unikać tworzenia plików tymczasowych na serwerze.

Czy ktoś ma lepszy pomysł?

questionAnswers(17)

yourAnswerToTheQuestion