Download-Dialog direkt nach dem Empfang der Header auslösen

8

Ich habe einen PDF-Export, der eine Weile dauert, um das PDF zu erstellen. Ich möchte, dass der Benutzer in der Lage ist, auf den Exportlink zu klicken und sofort mit einem Download-Dialog konfrontiert wird. Auf diese Weise können sie den Download starten und einfach darauf warten, bis der Download abgeschlossen ist. Anstatt auf den Link zu klicken, warten Sie auf die Generierung und warten Sie dann erneut auf den Download.

Hier ist ein sehr einfaches Beispiel in PHP:

%Vor%

Die Idee ist, die entsprechenden Header zu senden, flush () sie an den Browser, langsam erstellen Sie die PDF und senden Sie es schließlich an den Browser.

Das funktioniert perfekt in Chrom. Der Download-Dialog erscheint sofort und der Schlaf ist Teil der Download-Wartezeit.

In Firefox und InternetExplorer funktioniert das nicht. Diese Browser warten die vollen 15 Sekunden, bevor der Downloaddialog angezeigt wird.

Eine Idee, wie Sie den Download-Dialog sofort öffnen können, wäre sehr willkommen.

    
Andreas Gohr 23.11.2017, 11:28
quelle

2 Antworten

2

Einige Browser warten auf den tatsächlichen Inhalt, bevor sie den Download-Dialog anzeigen. Die Lösung ist einfach: Senden Sie einen PDF-Inhalt, bevor Sie den PDF-Inhalt erstellen.

Warte eine Minute. Wie schickst du etwas, bevor du es hast? Das klingt nach einer Zeitmaschine, oder? Mach dir keine Sorgen, es gibt einen Weg, um es zu umgehen.

Der PDF-Inhalt beginnt mit %PDF , daher müssen Sie einfach %PDF senden, bevor Sie flush () aufrufen. Nachdem die PDF-Erstellung abgeschlossen ist, entfernen Sie die ersten 4 Byte des neu erstellten PDF-Inhalts, bevor Sie ihn erneut ausgeben.

%Vor%

Diese Lösung funktioniert in jeder Sprache, da sie nicht auf PHP-Funktionen basiert.

Wenn Sie das absolute Minimum machen wollen, können Sie auch 1 Byte % senden und dann nur das erste Byte vor dem Echo entfernen. Gleiches Ergebnis.

    
Rei 02.12.2017, 17:21
quelle
0

Dies ist ein generelles Problem und hängt nicht mit einer bestimmten Sprache zusammen. Wir machen einen Prozess, um einige Zeit zu warten, bis die PDF-Generierung durchgeführt wird und starten dann unseren Download-Prozess.

Um also auf die PDF-Generierung zu warten, verwenden wir eine sleep () -Funktion, die es dem Prozess erlaubt, auf einen bestimmten Zeitraum - 15 wie erwähnt - zu warten.

%Vor%

Jetzt können wir nicht flush() den leeren Inhalt vor dem Kopf der PDF wird generiert, um den Browser. So können wir vor dem Kopf etwas statischen Inhalt senden und unseren Flush-Prozess starten.

Nach erfolgreicher PDF-Generierung können wir den zuvor hinzugefügten Inhalt entfernen und den aktualisierten Inhalt der Funktion flush () des Browsers hinzufügen.

Also wäre der Gesamtcode

%Vor%     
Mohd Belal 03.12.2017 05:53
quelle