Ermitteln, wann der Browser den Dateidownload empfängt

Ich habe eine Seite, auf der der Benutzer eine dynamisch generierte Datei herunterladen kann. Das Generieren dauert sehr lange, daher möchte ich eine Warteanzeige anzeigen. Das Problem ist, dass ich nicht herausfinden kann, wann der Browser die Datei erhalten hat, und daher die Anzeige ausblenden kann.

Ich stelle die Anfrage in einer verborgenen Form, die an den Server gesendet wird und deren Ergebnisse auf einen verborgenen Iframe abzielt. Dadurch ersetze ich nicht das gesamte Browserfenster mit dem Ergebnis. Ich warte auf ein "load" -Ereignis im iframe, in der Hoffnung, dass es ausgelöst wird, wenn der Download abgeschlossen ist.

Ich gebe einen "Content-Disposition: Anhang" -Header mit der Datei zurück, wodurch der Browser den "Speichern" -Dialog anzeigt. Der Browser löst jedoch kein "load" -Ereignis im iframe aus.

Ein Ansatz, den ich ausprobiert habe, ist die Verwendung einer mehrteiligen Antwort. Es wird also eine leere HTML-Datei sowie die angehängte herunterladbare Datei gesendet. Zum Beispiel:

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

Dies funktioniert in Firefox. Es empfängt die leere HTML-Datei, löst das Ereignis "load" aus und zeigt dann das Dialogfeld "Save" für die herunterladbare Datei an. Unter IE und Safari schlägt dies jedoch fehl. Der IE löst das "load" -Ereignis aus, lädt jedoch die Datei nicht herunter, und Safari lädt die Datei (mit dem falschen Namen und Inhaltstyp) herunter und löst das "load" -Ereignis nicht aus.

Ein anderer Ansatz könnte darin bestehen, einen Anruf zu tätigen, um die Dateierstellung zu starten, dann den Server abzufragen, bis er bereit ist, und dann die bereits erstellte Datei herunterzuladen. Es ist mir jedoch lieber, keine temporären Dateien auf dem Server zu erstellen.

Hat jemand eine bessere Idee?

Antworten auf die Frage(17)

Ihre Antwort auf die Frage