2009-01-07 5 views
5

In unserem aktuellen Projekt stellen wir einen PDF-Download zur Verfügung, der vom Benutzer über ein HTML-Formular, das er einreicht, angepasst werden kann. Es dauert einige Sekunden, um das PDF dynamisch zu erzeugen, und ich möchte dies visualisieren, z. indem Sie die Senden-Schaltfläche deaktivieren, bis der Download beginnt. Leider konnte ich keinen Weg finden zu erkennen, wann der Download startet *. Ich würde also nicht wissen, wann ich den Submit-Button wieder aktivieren soll.Gibt es eine Möglichkeit, den Start eines Downloads in JavaScript zu erkennen?

Ich habe bereits versucht, ein IFrame als Ziel meines HTML-Formulars anzugeben, in der Hoffnung, dass das onload Ereignis ausgelöst werden würde. Es ist jedoch nicht - wahrscheinlich, weil das PDF mit einem "Content-disposition: attachment" Header gesendet wird und es nicht tatsächlich in den IFrame geladen wird.

Die einzige Lösung, an die ich jetzt denken kann, besteht darin, das PDF in eine temporäre Datei auf dem Server zu erzeugen, die ich vermeiden möchte.

*) Lassen Sie mich das klarstellen: Ich müsste nicht wissen, ob der Download abgeschlossen ist oder ob er wirklich gestartet wurde. Ich möchte den Punkt erkennen, an dem der Browser den Benutzer fragt, ob er die Datei öffnen oder speichern soll. Ich denke, das passiert, wenn der Browser den HTTP-Header empfängt.

+0

Möchten Sie wissen, wann der Download beginnt oder wann er abgeschlossen wird? Wie auch immer, ich glaube nicht, dass eine temporäre Datei einen Unterschied machen wird. Auf der Client-Seite können Sie nicht feststellen, ob die Datei auf dem Server oder im laufenden Betrieb erstellt wurde. – Prestaul

+0

Sie reichen also das Formular ein, und die Antwort auf diese Einreichung ist eine PDF-Datei? Während der Pause befindet sich der Browser in dem Modus, in dem er auf eine Antwort vom Server wartet. ist das richtig? – Breton

+0

@Breton: richtig! @Pretaul: Ich würde gerne wissen, wann der Download beginnt. So könnte ich eine temporäre Datei erstellen, eine HTML-Antwort an das versteckte IFrame übergeben und dann die temporäre Datei per JavaScript im Onload-Handler abrufen. –

Antwort

2

Was Sie wollen, ist in der Lage zu erkennen, wenn die Größe der heruntergeladenen Datei von 0 auf einen positiven Wert ändert. Soweit ich weiß, ist dies mit Javascript nicht möglich - Sie benötigen ein Plug-in, das auf das Dateisystem des Clients zugreifen kann.

Eine empfohlene Vorgehensweise: Erstellen Sie eine Sitzung pro Download. Lassen Sie den Client den Server über den Status des Downloads abfragen. Dies könnte "nicht vorhanden", "nicht gestartet", "begonnen", "beendet" sein. Sie benötigen einige Seitenarbeit des Servers, um fortzufahren und den Status des Downloads sowie ein AJAX-Framework zu aktualisieren.

+0

Danke für Ihre Antwort! Ich interessiere mich nicht wirklich für den tatsächlichen Download (in eine Datei), wenn ich weiß, wann der HTTP-Antwort-Header empfangen wird, würde ausreichen. Ich bin noch nicht ganz davon überzeugt, dass dies in Javascript nicht möglich ist. –

+0

Ihre vorgeschlagene Arbeit ist ein bisschen komplexer als das, was ich gesucht habe.Aber ich denke, es würde funktionieren und es ist sicherlich die beste Idee bisher. –

+0

Ich bin immer noch nicht ganz davon überzeugt, dass es eine bessere Lösung gibt. Aber ich habe jetzt die Session/Status Idee implementiert, also werde ich diese Antwort akzeptieren. Danke noch einmal. –

0

Die einfachste Lösung wäre, die Zeit (großzügig) zu schätzen und es so zu machen. Es ist ein Hack, aber es gibt den gewünschten Effekt. Die andere Option besteht darin, das Formular mit einem Rückruf zu senden, der Ajax verwendet, um das Formular zu senden, und die Generatorrückgabedaten an die aufrufende Seite zu senden. http://www.jquery.com/ könnte ein guter Ausgangspunkt für diese Option sein.

4

Wenn ich Sie wäre, würde ich einen AJAX-Aufruf an den Server mit den Informationen machen, die Datei generieren und dann den Dateinamen/id/was auch immer zurück an das Javascript, was window.location so etwas wie download.php ? id = x (aber die Datei wurde bereits generiert, also legen Sie nur die Header fest und lesen sie aus). An diesem Punkt können Sie das Senden erneut aktivieren.

+0

Danke für Ihre Antwort! Was Sie beschreiben, ist die "temporäre Datei" -Lösung, die ich erwähnt habe und die ich gerne vermeiden würde. –

+0

Ooo, meine Entschuldigung. Total hat diesen Teil nicht gesehen. –

Verwandte Themen