PHP GET File Beispiel: PHP File Download

Das Beispiel nutzt die Funktion readfile, die eine Datei komplett ausliest und so wie sie gelesen wurde an den Browser des Besuchers (Client) schickt. Zuvor kann an dieser Stelle beispielsweise ein Download-Counter eingefügt werden, der die Anzahl der Downloads der Datei zählt – etwa eine auf einzelne Files bezogene Abwandlung des Counters aus dem letzten Beispiel. Im Beispiel wird die Datei direkt aus dem Dateisystem entnommen. Dies stellt die einfachste Version des Downloads dar. Denkbar ist statt des Einsatzes von readfile auch das Auslesen einer Datei, die in einer Datenbank – etwa einer MySQL-Datenbank – gespeichert ist. Hierzu werden die Daten nicht aus einer Datei, sondern aus einer Tabelle der Datenbank – einer Spalte vom Typ Blob (binary large object) – entnommen.

<?php
    // Wurde der Name und Pfad der herunterzuladenden Datei in den GET-Parametern
    // angegeben?
    if (isset ($_GET['filename'])) {
        // Pfad und Name der Datei, die heruntergeladen werden soll, aus den
        // Parametern (GET) entnehmen.
        $filename = $_GET['filename'];
        // Die angeforderte Datei muss existieren, ...
        if (file_exists ($_SERVER['DOCUMENT_ROOT'] . $filename) &&
            // eine Datei ...
            is_file ($_SERVER['DOCUMENT_ROOT'] . $filename) &&
            // und lesbar sein!
            is_readable ($_SERVER['DOCUMENT_ROOT'] . $filename)) {
            // Aufteilung von Filename in Pfad, Dateiname und Dateiendung
            $fileinfo = pathinfo ($filename);
            // Mime-Type der Datei ermitteln
            // Wenn die Funktion mime_content_type unterstützt wird, dann übernimmt
            // diese das Ermitteln des Mime-Types
            if (function_exists ('mime_content_type'))
                $mimetype = mime_content_type ($filename);
            // Ansonsten wird der Mime-Type aufgrund der Dateiendung festgelegt
            else {
                // Mime-Typen der jeweiligen Dateiendung zuordnen
                // Hier werden nur ZIP-Archive, PDFs, JPG und GIF-Bilder erkannt.
                // Eine Erweiterung um weitere Dateitypen kann durch
                // weitere Fallunterscheidungen erfolgen.
                switch (strtolower ($fileinfo['extension'])) {
                    // Gepackte Archivdateien
                    case 'tgz':
                    case 'gz':
                    case 'zip':
                        $mimetype = 'application/x-gzip';
                        break;
                    // PDF-Files
                    case 'pdf':
                        $mimetype = 'application/pdf';
                        break;
                    // GIF-Dateien
                    case 'gif':
                        $mimetype = 'image/gif';
                        break;
                    // JPG-Dateien
                    case 'jpg':
                        $mimetype = 'image/jpg';
                        break;
                    // Alle anderen Dateien bekommen einen Standard Mime-Type
                    default:
                        $mimetype = 'text/html';
                }
            }
            // Header mit dem ermittelten Mime-Type senden
            header ("content-type: $mimetype");
            // Dateiname der Datei per Header an den Client senden
            header ("content-disposition: attachment; filename=" . $fileinfo['basename']);
            // Datei an den Client verschicken
            readfile ($_SERVER['DOCUMENT_ROOT'] . $filename);
        }
        else {
            // Download der Datei konnte nicht durchgeführt werden
            // Deshalb erfolgt hier die Ausgabe einer Fehlerseite, die den
            // Benutzer auf den Fehler hinweist.
            // HTTP-Status für Dokument nicht gefunden an den Client senden
            header ("HTTP/1.0 404 Not Found");
            ?>
                <html>
                    <head>
                        <title>Beim Download ist ein Fehler aufgetreten</title>
                    </head>
                    <body>
                        <h1>Fehler beim Download aufgetreten!</h1>
                        <p>
                            Die angeforderte Datei wurde nicht gefunden oder ist nicht lesbar!
                        </p>
                    </body>
                </html>
            <?php
        }
    }
    else {
        // Fehlerseite anzeigen (Parameter für den Download wurden nicht angegeben)
        // Entsprechender HTTP-Status wird über den Header an den Client geschickt
        header ("HTTP/1.0 400 Bad Request");
        ?>
            <html>
                <head>
                    <title>Fehler beim Download aufgetreten</title>
                </head>
                <body>
                    <h1>Fehler beim Download</h1>
                    <p>
                        Dem Script wurde keine Angabe zur herunterzuladenden Datei angegeben!
                    </p>
                </body>
            </html>
        <?php
    }
?>
Letzte Posts aus unserem Forum

Wer kennt .....

Hallo erstmal wer kennt von euch einen WEbprogrammieren,desginer der mir eine Seite erstellen kann ,Communityportal sowas in der art wie ... » mehr

von NCWebmaster am Mittwoch, 7. Oktober 2009 00:32 in PHP - bisher 1 Antwort
Letzter Beitrag: Mittwoch, 7. Oktober 2009 13:26 von kalle

Hallo auch, da gibt es sicher viele die das machen würden, allerdings deutlich weniger die es auch tatsächlich machen könnten - noch einmal weniger ... » mehr

oh Mann

Hallo erstmals..... also ich kenn mich ja nicht so aus, aber ich denke die Menschheit fliegt auf den Mond, dann müsste es auch eine Lösung für mein ... » mehr

von Dummbazz am Dienstag, 24. Februar 2009 15:11 in PHP - bisher 2 Antworten
Letzter Beitrag: Mittwoch, 25. Februar 2009 11:48 von Dummbazz

Danke für die aufmunternde Worte... ... » mehr

counter auch ohne datenbank?

tach auch, ich habe nach einem besucherzähler gesucht, der auf meiner seite anzeigt, wieviele besucher sich dort aufhalten. allerdings habe ich ... » mehr

von marcel am Montag, 8. Dezember 2008 12:21 in PHP - bisher 1 Antwort
Letzter Beitrag: Montag, 8. Dezember 2008 13:34 von alm

Hallo, sicher kann die Counter-Klasse so umgeschrieben werden, dass sie auch ohne Datenbankanbindung funktioniert. Allerdings würde das einer neuen ... » mehr

DAten speichern und abfragen

Hallo an Alle! Hoffe, dass ich hier im richtigen Forum bin. Vielleicht kann mir jemand einen Tip geben. Ich möchte auf meiner Webpage ein Formular ... » mehr

von muenchner am Samstag, 12. Juli 2008 18:31 in PHP - bisher 1 Antwort
Letzter Beitrag: Montag, 14. Juli 2008 08:49 von alm

Hallo, ich bin mir nicht sicher, wie das jetzt gemeint ist! Geht es um die Frage: Sollen die Optionen des Forumlars (die einzelnen Checkboxen) in ... » mehr

Tutorials :: PHP & MySQL - Problem

Hi, zunächsteinmal danke für das Tutorial: ... » mehr

von migges am Montag, 2. Juni 2008 12:05 in PHP - bisher 3 Antworten
Letzter Beitrag: Dienstag, 3. Juni 2008 11:45 von alm

Das mit den Oder-Operatoren wundert mich ein wenig... Welchen Fehler hat der Interpreter an diesen Stellen ausgegeben? Ich habe bislang mit ... » mehr

¬ Tutorials



¬ Insolvenzrecht