Probleme mit Download von dynamisch generierten Dateien im Internet Explorer

Es gibt Dinge, die sich einem einfach regelmäßig wieder in den Weg stellen – so zum Beispiel Probleme mit Downloads von dynamisch generierten Dateien in PHP im Internet Explorer.

Das folgende Fehler PopUp der Internet Explorer 6, 7 oder 8 sind ein immer wiederkehrendes Ärgernis, wenn man versucht, einen Dateidownload mittels PHP zu realisieren:

Fehler beim Herunterladen eines dynamisch generierten Dokuments im IE

Hierbei handelt es sich um ein dynamisch im Memory des Webservers generierten PDF Dokuments, das eigentlich als PDF_Preview.pdf betitelte Datei im Browser ankommen soll (und im Firefox, Safari, Opera und Chrome auch tut).

Zur Erzeugung wird der PDFLib Personalization Server genutzt, und am Ende des ganzen Erzeugungsprozesses steht ein Buffer (hier beispielhaft $pdf_buffer) des kompletten Dokumentes als Variable zur Verfügung.

Was für den Browser jetzt noch passieren muss: Per PHP header() Funktion wird dem Browser mitgeteilt, dass es sich um einen bestimmten Mimetype (ein Tool, um den MIME Type bei Dateiuploads herauszufinden gibt es hier) bzw. Datenstrom handelt (in diesem Fall handelt es sich um ein PDF, dass mit Content-type: application/pdf beschrieben wird). Weiterhin wird definiert, dass es als Dateidownload zur Verfügung gestellt werden soll, und der gewünschte Dateiname wird vom Script übergeben).

Um diesen Dateidownload (auch mit dem Internet Explorer) hinzubekommen, müssen zusätzlich diese zwei weiteren Headerinformationen mit angegeben werden:

[source:php]
header(‚Content-type: application/pdf‘)
header(‚Content-Disposition: attachment; filename=“PDF_Preview.pdf“‚);

// Folgende zwei Zeilen sind für den IE wichtig,
// alle anderen Browser brauchen sie nicht
// (stören sich daran aber auch nicht)
header(„Pragma: public“);
header(„Cache-Control: max-age=0“);

echo $pdf_buffer;
[/source]

Im Vorfeld (auf jeden Fall bevor der Buffer mit echo ausgegeben wird) sollte allerdings in jedem Fall die zu erwartende Dateigröße mittels
[source:php]
$pdf_buffer = PDF_get_buffer($p);
$len = strlen($buf);
header(„Content-Length: $len“);
[/source]
berechnet und ebenfalls per Header ausgegeben werden.

Vielleicht hilft dieser schnelle Artikel mir selbst auch beim nächsten Auftreten solcher Probleme als Gedächtnisstütze… 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.