"PHP how-to" Datei-Download-Dialog - Johannes Schwichtenberg

johannesschwichtenberg.de

Dateien oder Inhalte per Download-Dialog ausgeben

PHP how-to

Einleitung

Neben der Ausgabe am Bildschirm im (X)HTML-Format ist häufig das bereitstellen der Informationen als Datei im CSV-, PDF-Format usw. zum Download notwendig.

Hierbei kann es entweder sein, dass eine vorhandene Datei von PHP ausgegeben werden soll, z.B. um im Script die Zugriffsberechtigung zu prüfen, andererseits kann es erforderlich sein, dynamisch erzeugte Inhalte als Datei-Download bereitzustellen: Bilder, PDFs, CSV/Ascii-Daten in Austauschformaten usw.

Um sicherzustellen, dass der Benutzer die Daten als Download angezeigt bekommt und nicht im Browser – wie das besonders bei Ascii-Daten meist der Fall sein würde – kann man den HTTP Dokumenten-Header manipulieren.

Wichtig: Wie bei allen Header-Manipulationen (Session, Cookie usw.) ist auch in diesem Fall zwingend erforderlich, dass keinerlei Ausgabe vor Aufruf der header-Funktion erfolgt ist!

Beispielcode: Datei als Download bereitstellen

$pfad = "$ordner/$datei";

header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"". urlencode($datei) ."\"");
header("Content-Length: ". filesize($pfad));
header("Content-Transfer-Encoding: binary");

readfile($pfad);
exit();

Durch Setzen der entsprechenden Parameter definiert man, dass ein Download forciert werden soll und  der Inhalt als Anhang (attachment) mit dem ursprünglichen Dateinamen ausgegeben wird. Außerdem muss noch die Länge und (optional) das Encoding angegeben werden. Anschließend "reicht" die Funktion readfile den Dateiinhalt "durch".

Beispielcode: Dynamisch erzeugten Inhalt als Download-Datei ausgeben

//Daten
$benutzer = array( array("hanz", "hinz"),
array("dieter", "kunz"),
array("max", "mustermann"));

//CSV-Format erzeugen
$csv = "Vorname;Nachname
\r\n";
foreach($benutzer AS $zeile)
$csv .= implode(";", $zeile)."\r\n";

header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"Benutzer.csv\"");
header("Content-Length: ". strlen($csv));

echo $csv;
exit();

In diesem Beispiel soll demonstriert werden, wie dynamisch erzeugte Ascii-Daten ausgeben werden können und dem Benutzer das Speichern der Inahlte per Download-Dialog sehr einfach ermöglicht wird.

Ob die Daten aus einer Datenbank ausgelesen wurden, die Kopie einer versendeten E-Mail sind oder aus Formular-Daten erzeugt wurden ist hierbei völlig egal, wichtig ist, dass sie als Zeichenkette (hier in der Variable $csv) vorliegen und wie gewünscht formatiert wurden.

Die Datei Benutzer.csv aus dem obigen Beispiel sollte folgenden Inhalt haben:

Vorname;Nachname
hanz;hinz
dieter;kunz
max;mustermann


Da das Verarbeiten von Datei-Anhängen vomm Browser umgesetzt wird, kann die Implementierung – je nach Dateiformat oder Dateigröße – gewisse Anpassungen erfordern und sollte für die jeweilige Umsetzung in den gängigen Browsern getestet werden. Weitere Beispiele finden sich u.a. auf php.net/header.

 

Hinweis: Sämtliche Informationen ohne Garantie und Anspruch auf Vollständigkeit, jedoch nach bestem Wissen des Autors zum Zeitpunkt der Erstellung.