Download anbieten (erzwingen)

Wenn jemand über das HTTP eine Datei aus dem Internet aufruft, prüft der Brauser für gewöhnlich was damit geschehen soll. Eine HTML Datei kann er darstellen, also stellt er sie dar. Das gilt überhaupt für alle Text-Dateien, wie Rohtext, XML usw. Auch Bilder werden dargestellt und manche Brauser führen auch Audio-Dateien und Videos gleich selbst aus.

Will man aber einen Download erzwingen, ohne, das man ein Archiv wie ZIP, RAR, TAR oder BZ2 nutzt (was eigentlich sehr empfehlenswert ist, weil es ja komprimiert wird, also die Dateigröße verringert und so den Transfer vom Herausgeber der Seite und dem Besucher schont) muss man auf andere Mittel zurückgreifen.

Mein Ansatz: Einen HTTP-Header voranschicken, der dem Brauser mitteilt, dass er die Datei anders als normal zu behandeln hat.

Wenn wir einen Header wie "Content-Type: apllication/octet-stream" zu Beginn des PHP-Skriptes setzen, wird dieser Vom Brauser des Empfängers zuerst empfangen. Eher er beginnt die Datei darzustellen wie ers gewohnt ist, ließt er im Header, dass er das diesmal nicht tun soll. Das Application teilt dem Brauser mit, das es sich um eine Anwendung handelt. Der Brauser ist gedacht, um Textdateien darzustellen, nicht um Anwendung en auszuführen. Ergo bietet er die Datei zum Download an, er denkt wir haben ihm eine Applikation geschickt.

Über den Header "Content-Disposition: attachment; filename="wie_die_datei_heißen_soll.txt"" können wir sogar bestimmen welchen Dateinamen der Brauser seinem Benutzer in diesem Fall anbietet.

Nachdem wir diese Header gesetzt haben, können wir jeden beliebigen Inhalt ausgeben. Er wird in die Datei geschrieben und dem Benutzer zum Download angeboten. Wir können einfach mit echo einen Text ausgeben, oder uns mit file_get_contents eine andere Datei reinholen und diese dann einfach ausgeben.

Beispiele:

<?php
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="liesmich.txt"');
echo 'Hier steht der Text.';
?>

Wir geben die Rohtext-Datei "liesmich.txt" mit dem Inhalt "Hier steht der Text." aus.

<?php
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="bild.jpg"');
echo file_get_contents('pfad_zu_bild_von_irgendwo_her.jpg');
?>

Wir holen uns die Bild-Datei "pfad_zu_bild_von_irgendwo_her.jpg" und geben deren Inhalt einfach mit echo aus.

Kommentare