Download von Dateien erzwingen

Nicht immer ist es gewünscht, dass eine Datei direkt im Browser geöffnet wird. Gerade Bilder, HTML-Dokumente und auch PDFs werden aber automatisch im Webbrowser angezeigt. Mit einem Trick kann man sie als Download öffnen.

Eigentlich hat der liebe Gott Mime-Types kreiert um verschiedene Dateiformate durch den Browser richtig behandeln zu lassen. Unbekannte Formate und Binärformate werden vom Browser als Download angeboten.

Leider funktioniert der type Parameter bei Links nur bedingt. Der folgende Code <a href="/test.jpg" type="application/octet-stream">download</a> erzeugt einen Link auf ein Bild, das aber nicht (wie gefordert) als Binärdatei gespeichert, sondern im Browser angezeigt wird. Ursache dafür ist der Webserver, der für Bilder automatisch einen "image"-header sendet.

Lösung 1: Das Download Script

Mit php kann man sich ein kurzes Script basteln, dass die gewünschte Datei liest und als Binärdatei sendet.

Das folgende Programm würde beispielsweise so aufgerufen: (http://www.meinserver.de/force_download.php?file=test.jpg). Der Trick liegt hierbei im Mime-Type (application/force-download). Den Typ force-download gibt es nämlich nicht.

 

<?php
// unbekannten type force-download angeben und datei senden
$fname = preg_replace("/[^0-9a-z.\-_ ]/i", "", strip_tags(trim($_GET["file"])));
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"".$fname."\";" );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".filesize($filename));
readfile("/downloads/".$filename);
exit();
?>

 

Dadurch wird der Webbrowser animiert die Datei als Download anzubieten. Die Lösung ist nicht ganz sauber, funktioniert aber mit allen Browsern. Auch unser Downloadscript aus dem Beitrag PHP Download-counter Scriptkann dadurch ergänzt werden.

Lösung 2: Umleitung mittels Htaccess

Eleganter ist es jedoch, wenn der Server Bilder, Dokumente oder PDFs aus einen bestimmten Verzeichnis einfach als binäre Anhänge sendet. Dazu benötigt man Zugriff auf .htaccess

Im Downloadverzeichniss wird folgende .htaccess Datei erstellt.

<FilesMatch "\.(?i:pdf|jpg|gif)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>

 

Achtung: Nur im gewünschten Downloadverzeichnis ablegen!

 

Voraussetzung ist jedoch, dass Apache mod_headers aktiviert hat. Sonst kommt es zu einem 500er Serverfehler. Bei manchem Providern wie 1und1 kann man Module dynamisch in der .htacces Datei nachladen.

Bsp: LoadModule headers_module modules/mod_headers.so