PHP Download-Script



  • Wie kann man ein Download-Script in PHP schreiben?

    [ Dieser Beitrag wurde am 25.03.2002 um 22:11 Uhr von Loggy editiert. ]



  • Aus:
    http://www.php-center.de/faq/faq-open_exec.html#open_exec-4

    Grundsätzlich kann man einen Dateidownload auf zwei verschiedene Arten realisieren: Entweder man schreibt ein PHP-Script, das einen Redirect (siehe Wie erzeuge ich mit PHP einen Redirect auf eine andere Seite?) auf die zu ladende Datei generiert, oder man startet den Download durch das PHP-Script. Die Methode mit dem Redirect hat den Nachteil, daß Anwender die Ziel-URL des Redirect mitbekommen und später dann direkt und ungeschützt auf diese Datei zugreifen können.

    Will man das verhindern, muß man den Download innerhalb von PHP abhandeln. Die zu ladenden Dateien liegen dann außerhalb der Document Root des Webservers (haben also keine URL) und sind nur durch PHP zugreifbar. In PHP sendet man den passenden MIME-Typ als Header und schickt dann die gewünschte Datei hinterher. Natürlich kann man vorher noch einen Downloadzähler aktualisieren oder überprüfen, ob der Anwender überhaupt für den Download autorisiert ist.

    # $download sei der Bezeichner für die zu ladende Datei
    
    # Dieses Verzeichnis liegt außerhalb der Document_Root und
    # ist nicht per URL zuzugreifen.
    $basedir = "/home/www/download";
    
    # Übersetzung von Download-Bezeichner in Dateinamen.
    $filelist = array(
      "file1" => "area1/datei1.zip",
      "file2" => "area1/datei2.zip",
      "file3" => "area2/datei1.zip"
    );
    
    # Einbruchsversuch abfangen.
    if ($filelist[$download] == "")
      die("Datei $download nicht vorhanden.");
    
    # Vertrauenswürdigen Dateinamen basteln.
    $filename = sprintf("%s/%s", $basedir, $filelist[$download]);
    
    # Passenden Datentyp erzeugen.
    header("Content-Type: application/octet-stream");
    
    # Passenden Dateinamen im Download-Requester vorgeben,
    # z.B. den Original-Dateinamen
    $save_as_name = basename($filelist[$download]);
    header("Content-Disposition: attachment; filename=\"".$save_as_name."\"");
    
    # Datei ausgeben.
    readfile($filename);
    

    Achtung:
    Hier noch ein Bug im IE: http://www.zend.com/manual/function.header.php

    <?php
    header("Content-type: application/pdf");
    header("Content-Disposition: attachment; filename=downloaded.pdf");
    
    /* ... output pdf file ... */
    

    Note: There is a bug in Microsoft Internet Explorer 4.01 that prevents this from working. There is no workaround. There is also a bug in Microsoft Internet Explorer 5.5 that interferes with this, which can be resolved by upgrading to Service Pack 2 or later.

    [ Dieser Beitrag wurde am 26.03.2002 um 09:03 Uhr von Loggy editiert. ]


Anmelden zum Antworten