File download über den header

  • Im Beispiel wird über einen Klick auf einen Download-Button ein Script abgearbeitet, welches aus einem, für den Benutzer von außen nicht sichtbaren, Verzeichnis einen Dateidownload startet.
  • Beispiel für eine HTML-Datei, die download.php?f=$filename aufruft:
$filename = "myfile.gif";

echo "<form method="post" action="download.php?f=".$filename.">\n";
echo "  <input type="submit" name="btn_download" class="button" value="Download">\n";
echo "</form>\n";
  • Beispiel für die download.php, die die Datei aus einem Verzeichnis liefert:
// übergebenen Dateinamen aus der GET-Variablen holen
$filename = $_GET["f"];

// Pfad zur Datei zusammenbauen
$downloadfile = "../".$filename;
// Content type sollte Datei spezifisch übergeben werden
// nähere Infos siehe: http://de.selfhtml.org/diverses/mimetypen.htm
$content_type = "image/jpeg";

// Dateiname sollte nicht leer sein
if (!empty($filename))
{
    // Dateiname darf keine Slashes enthalten, um zu verhindern, dass
    // Dateien aus anderen Verzeichnissen vom Server geladen werden können
    if (!preg_match('=/=', $filename))
    {
        // wenn Datei vorhanden
        if (file_exists($downloadfile))
        {
            $filesize = filesize($downloadfile);
            // Header-Infos für den Browser zusammenbauen
            header("Content-Description: File Transfer");
            header("Content-Type: ".$content_type);
            header("Content-Disposition: attachment; filename='".$filename."'");
            header("Content-Length: ".$filesize."");
            // Datei liefern
            readfile($downloadfile);
        }
        else
        {
            echo "Datei nicht vorhanden: ".$filename."\n";
        }
    }
    else
    {
        echo "Dateiname enthält slashes, das ist aus Sicherheitsgründen nicht erlaubt.\n";
    }
}
else
{
    echo "Der übergebene Dateiname ist leer.\n";
}

// hier Script abbrechen und zur ursprünglichen Datei zurückkehren
exit();