preload
Aug 27

In vielen PHP-Anwendungen findet man immer wieder mal die Funktion, eine Datei herunterzuladen, die nicht im Document-Root des Servers liegt. Hierzu wird dann ein kleines download-Skript erstellt, das in der Regel den gewünschten Dateinamen als Parameter erhält und dann die Datei direkt zum Browser ausgibt. Bequemerweise stellt PHP dafür die Funktion readfile zur Verfügung. Ein typischer Codeblock sieht dann ungefähr so aus:

if (isset($_GET["file"])) {
   $sFileName = $_GET["file"];
   // check for invalid file paths and preceed with file archive directory
   $sFile = getFullFileName($sSubDir);
   if (file_exists($sFile)) {
     header("Content-type: application/x-download");
     header("Content-Disposition: attachment; filename=$sFileName");
     header("Content-Transfer-Encoding: binary");
     header('Content-Length: ' . filesize($sFile));
     ob_clean();
     flush();
     readfile($sFile);
   }
}

Wichtig ist dabei die Verwendung von ob_clean() und flush() nach dem Senden der Header-Angaben. Ansonsten werden speziell Dateien mit Binärdaten nicht korrekt übermittelt und lassen sich dann beim Empfänger ggf. nicht öffnen.

Leave a Reply

You must be logged in to post a comment.