35 Stimmen

PHP: Datei Download Skript

Tutorial von Stefan Trost | 16.09.2014 um 23:06

Heute möchte ich euch zeigen, wie ihr mit PHP ein kleines Download-Skript erstellen könnt. Ein Aufruf des Skripts soll später über einen einfachen HTML-Link erfolgen.

HTML

Auf unserer Website möchten wir HTML-Links in folgender Form benutzen, um den Download einer Datei zu starten.

<a href="download.php?file=test.pdf">Download</a>

Mit diesem Link öffnen wir das PHP-Skript (gespeichert als download.php) und übergeben per GET die Variable "file", hier "test.pdf". Wie man die Skript-Datei, die Variable oder den Link nennt ist natürlich jedem selbst überlassen.

PHP

Folgenden PHP-Code schreiben wir in die Datei "download.php".

$file = preg_replace("/[^0-9a-z.\-_ ]/i", "", $_GET['file']);
$file = 'filedir/'.$file;

if (file_exists($file)) {	
  header('Content-Disposition: attachement; filename='.basename($file));
  header('Content-Type: application/force-download');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Content-Length: '.filesize($file));
  header('Connection: close');
  
  readfile($file);
} else {
  header("HTTP/1.0 404 Not Found");			
}

Zunächst holen wir uns über $_GET['file'] die Variable, die wir im Link definiert hatten (hier: test.pdf). Absolut wichtig ist an dieser Stelle, dass wir sicherstellen, dass niemand das Skript mit einer Datei erfolgreich aufrufen kann, auf die er eigentlich keinen Zugriff haben sollte. Mit einem Aufruf "download.php?file=../secret.php" könnte sonst jeder beliebige Dateien (zum Beispiel PHP-Dateien im Klartext inklusive Passwörter etc.) von unserem Webspace herunterladen.

Wir machen das hier, indem wir im Dateinamen nur Buchstaben, Zahlen und die Zeichen ".", "-" und "_" erlauben und anschließend ein Verzeichnis ("filedir/") anhängen, indem sich keine Skripte oder andere wichtige Dateien befinden.

Besser wäre es gleich nur eine File-ID zu übergeben und das Skript in der Form "download.php?file=123" aufzurufen. Den richtigen Namen der Datei könnte man dann aus einer Datenbank holen. Dies ist auch dann zu empfehlen, wenn man verschleiern möchte, in welchem Ordner die Dateien auf dem Server gespeichert sind und wie die gespeicherten Dateien heißen. Auch für das Zählen von Downloads bietet sich hier die Möglichkeit, direkt mit einer Datenbank zu interagieren. Der Einfachheit halber haben wir aber hier in dem Beispiel auf eine Datenbank verzichtet.

Wenn wir den Pfad der Datei ermittelt haben, prüfen wir zunächst, ob die Datei tatsächlich auf dem Server existiert. Falls nicht, geben wir ein "404 Not Found" aus, ansonsten starten wir den Download.

Für den Download senden wir zunächst einige Header an den anfragenden Browser und geben anschließend einfach den Inhalt der Datei mit der PHP-Funktion readfile() aus. Auch dieser Header lässt sich natürlich noch nach Belieben anpassen. Ich möchte aber nur auf einige kleine Details eingehen.

Erklärung des Headers

Das "Content-Type: application/force-download" sorgt beispielsweise dafür, dass die Datei zum Download angeboten wird und nicht im Browser geöffnet wird (kann man auch weglassen).

Der angegebene Name in der Zeile "Content-Disposition: attachement; filename='.basename($file)", ist der Name, unter dem der Browser die Datei speichern wird. Diese leiten wir hier mit "basename($file)" direkt aus dem übergebenen String ab, wir können aber auch einen beliebigen anderen Namen (zum Beispiel "Content-Disposition: attachement; filename=download.pdf") in die Zeile schreiben, um einen anderen Namen zu verwenden, als der, unter dem die Datei auf dem Server gespeichert ist.

Mit "Expires: 0" und "Cache-Control: must-revalidate" möchten wir erreichen, dass der Browser die Datei nicht in seinen Cache schreibt und über die aktuelle Datei herunterlädt.

AntwortenPositivNegativ

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

CSS-Stylesheets in HTML einbinden

Tutorial | 0 Kommentare

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.