Ich habe eine Seite, auf der der Benutzer eine dynamisch generierte Datei herunterladen kann. Das Generieren dauert lange, daher möchte ich einen "Warte" -Indikator anzeigen. Das Problem ist, dass ich nicht herausfinden kann, wie ich feststellen kann, wann der Browser die Datei empfangen hat, sodass ich den Indikator ausblenden kann.
Ich mache die Anfrage in einer versteckten Form, die an den Server POSTs und zielt auf einen versteckten Iframe für seine Ergebnisse. Dies ist so, dass ich nicht das gesamte Browserfenster durch das Ergebnis ersetze. Ich warte auf ein "Lade" -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 das Dialogfeld "Speichern" anzeigt. Der Browser löst jedoch kein "Lade" -Ereignis im Iframe aus.
Ein Ansatz, den ich ausprobiert habe, ist die Verwendung einer mehrteiligen Antwort. Es würde also eine leere HTML-Datei sowie die angehängte herunterladbare Datei senden. 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 "Laden" aus und zeigt dann das Dialogfeld "Speichern" für die herunterladbare Datei an. Aber es schlägt auf IE und Safari fehl; IE löst das Ereignis "Laden" aus, lädt die Datei jedoch nicht herunter, und Safari lädt die Datei herunter (mit dem falschen Namen und Inhaltstyp) und löst das Ereignis "Laden" 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 fertig ist, und dann die bereits erstellte Datei herunterzuladen. Ich möchte jedoch lieber vermeiden, temporäre Dateien auf dem Server zu erstellen.
Hat jemand eine bessere Idee?