Ich habe eine Seite, die es dem Benutzer ermöglicht, eine dynamisch generierte Datei herunterzuladen. Die Generierung dauert lange, daher möchte ich eine "Warte"-Anzeige einblenden. Das Problem ist, ich kann nicht herausfinden, wie zu erkennen, wenn der Browser die Datei erhalten hat, so dass ich die Anzeige ausblenden kann.
Ich beantrage ein verstecktes Formular, das POSTs an den Server und zielt auf einen versteckten Iframe für seine Ergebnisse. Dies ist, so dass ich nicht das gesamte Browserfenster mit dem Ergebnis ersetzen. Ich höre auf ein "load"-Ereignis auf dem iframe, in der Hoffnung, dass es ausgelöst wird, wenn der Download abgeschlossen ist.
Ich gebe ein " Content-Disposition: attachment
"Dies veranlasst den Browser, das Dialogfeld "Speichern" anzuzeigen. Aber der Browser löst kein "Load"-Ereignis im Iframe aus.
Ein Ansatz, den ich ausprobiert habe, ist die Verwendung einer multi-part
Antwort. Es würde also sowohl eine leere HTML-Datei als auch 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; er empfängt die leere HTML-Datei, feuert die "laden" Ereignis und zeigt dann die "Speichern" Dialog für die herunterladbare Datei. Aber es schlägt fehl bei Internet Explorer y Safari Internet Explorer löst das Ereignis "Laden" aus, lädt die Datei aber nicht herunter, und Safari Downloads die Datei (mit dem falschen Namen und Inhaltstyp) und löst nicht die "laden" Veranstaltung.
Ein anderer Ansatz könnte darin bestehen, die Erstellung der Datei zu starten, den Server abzufragen, bis sie fertig ist, und dann die bereits erstellte Datei herunterzuladen. Aber ich würde es lieber vermeiden, temporäre Dateien auf dem Server zu erstellen.
Was sollte ich tun?