PHP Datei Beispiel: PHP File Upload – Dateien mit einem Formular hochladen

Häufig bieten HTML-Formulare die Möglichkeit, neben Texteingaben und Eingaben mittels Checkboxen oder Radiobuttons, auch Dateien hochzuladen. Derartige Formulare werden beispielsweise in diversen Communities verwendet um Avatare, Videos oder Fotos auf den Server hochzuladen, die dann im Profil des Benutzers angezeigt werden. Aber auch in den Formularen von Job-Börsen, wo Bewerber in einem Lebenslauf ihr berufliches Profil darlegen können, ist der Upload von Dateien – meist in Form von PDF- oder Textdokumenten – zu finden.

Damit Uploads mit PHP auch funktionieren müssen einige Rahmenbedingungen gegeben sein, die über die Konfigurationsdatei des PHP-Systems (php.ini) festgelegt werden können. So muss das Hochladen von Dateien – mittels eines Konfigurationseintrages von file_uploads – grundsätzlich erlaubt sein. Darüber hinaus bestehen Beschränkungen bzgl. der Dateigröße von hochzuladenden Dateien. Wichtig sind hier die Einträge max_filesize, post_max_size und memory_limit. Diese sind Standardmäßig auf 2, 8 und 8 MB gesetzt, können aber je nach Konfiguration abweichen. Zu beachten ist hier, dass die Werte max_filesize < post_max_size < memory_limit gesetzt werden. Mit dem PHP-Script im nächsten Script-Abschnitt werden die durch die Serverkonfiguration gesetzten Werte ausgelesen und entsprechend formatiert ausgegeben.

<?php
    // Informationen zur Konfiguration von PHP File Uploads ermitteln und ausgeben
    $upload = (get_cfg_var ('file_uploads') ? 'erlaubt' : 'nicht erlaubt');
    $upload_nach = (get_cfg_var ('upload_tmp_dir') ? get_cfg_var ('upload_tmp_dir') : 'nicht in PHP.INI angegeben (Tempor&auml;res Verzeichnis des Systems)');
    $upload_size = (get_cfg_var ('max_filesize') ? get_cfg_var ('max_filesize') : 'nicht in PHP.INI angegeben (evtl. Standardwert von 2MB)');
    $post_max_size = (get_cfg_var ('post_max_size') ? get_cfg_var ('post_max_size') : 'nicht in PHP.INI angegeben (evtl. Standardwert von 8MB)');
    $memory_limit = (get_cfg_var ('memory_limit') ? get_cfg_var ('memory_limit') : 'nicht in PHP.INI angegeben (evtl. Standardwert von 8MB)');
    echo 'File Uploads: ' . $upload . '<br>' .
         'Tempor&auml;res Verzeichnis f&uuml;r den Upload: ' . $upload_nach . '<br>' .
         'Maximale Dateigr&ouml;&szlig;e f&uuml;r den Upload von Dateien: ' . $upload_size . '<br>' .
         'Maximale Gr&ouml;&szlig;e von POST-Requests: ' . $post_max_size . '<br>' .
         'Maximal verf&uuml;gbarer Speicher zur Verarbeitung von Seitenanfragen: ' . $memory_limit . '<br>';
?>

Der folgende Script-Code implementiert ein Upload-Formular und das zur Verarbeitung nötige Upload-Script in PHP. Das Beispiel können Sie einfach kopieren und in einer PHP-Datei – beispielsweise mit dem Namen upload.php – auf Ihrem Webserver abspeichern. Beim Aufruf der ensprechenden URL wird eine HTML-Seite mit einem Formular angezeigt, das zum Upload einer Datei auffordert.

<?php
    // Mit PHP Datei hochladen (php file upload)
    // Maximale Dateigröße der zum Upload vorgesehenen Datei festlegen.
    // Diese Angabe muss in Bytes erfolgen (hier liegt die Beschränkung bei 3 MB)
    $max_file_size = 3 * 1024 * 1024;
    // Wurde die URL direkt aufgerufen oder erfolgte schon ein Datei-Upload?
    if (!empty ($_FILES)) {
        // Upload der Datei bereits erfolgt, da die Files-Variable nicht leer ist
        // Auf den Status des Dateiuploads entsprechend reagieren
        switch ($_FILES['userfile']['error']) {
            // Upload war erfolgreich - Hier folgt die weitere Behandlung der Datei
            case UPLOAD_ERR_OK:
                // Nach erfolgreichem Upload der Datei folgt hier die weitere
                // Verarbeitung der hochgeladenen Datei. Im Beispiel wird die Datei 
                // unter ihrem eigenen Dateinamen in ein Unterverzeichnis gespeichert.
                // Zunächst wird geklärt, ob die unter dem temporären Namen gespeicherte Datei
                // auch zuvor hochgeladen wurde
                if (is_uploaded_file ($_FILES['userfile']['tmp_name']))
                    // Verschieben der hochgeladenen Datei in ein dafür vorgesehenes Verzeichnis
                    move_uploaded_file ($_FILES['userfile']['tmp_name'], 'daten/' . $_FILES['userfile']['name']);
                break;
            // Datei war zu groß (in der php.ini gesetzte maximale Dateigröße überschritten)
            case UPLOAD_ERR_INI_SIZE:
                echo 'Upload fehlgeschlagen: Die von Ihnen angegebene Datei ist zu gro&szlig;!';
                // In der php.ini angegebene maximale Dateigröße für Uploads ausgeben, falls
                // diese per Konfiguration festgelegt wurde.
                if (get_cfg_var ('max_filesize'))
                    echo ' Die maximale Gr&ouml;&szlig;e f&uuml;r den Upload von Dateien ' .
                         'betr&auml;gt ' . get_cfg_var ('max_filesize') . ' Bytes!';
                break;
            // Im Formular angegebene Dateigrößenbeschränkung wurde überschritten
            case UPLOAD_ERR_FORM_SIZE:
                echo 'Die von Ihnen angegebene Datei ist zu Gro&szlig;! ' .
                     'Bitte w&auml;hlen Sie Dateien mit einer maximalen Gr&ouml;&szlig;e ' .
                     'von ' . $max_file_size . ' Bytes aus!';
                break;
            // Datei wurde nicht vollständig übertragen
            case UPLOAD_ERR_PARTIAL:
                echo 'Bei der &Uuml;bertragung der Datei ist ein Fehler aufgetreten: ' .
                     'Die Datei wurde nicht vollst&auml;ndig durch den Server empfangen! ' .
                     'Bitte versuchen Sie es nocheinmal.';
                break;
            // Es wurde keine Datei zum Upload angegeben
            case UPLOAD_ERR_NO_FILE:
                echo 'Sie haben keine Datei zum Upload ausgew&auml;hlt. ' .
                     'Bitte nutzen Sie den Dateiauswahldialog, um eine Datei f&uuml;r den Upload auszuw&auml;hlen.';
                break;
        }
    }
    else {
        // Die Seite wurde nicht als Folge eines Form-Submits aufgerufen.
        // Aus diesem Grunde muss das Formular angezeigt werden.
        ?>
        <html>
            <head>
                <title>PHP File Upload Beispiel</title>
            </head>
            <body>
                <form enctype="multipart/form-data" action="" method="post">
                    <input type="hidden" name="MAX_FILE_SIZE" value="<?php echo $max_file_size ?>">
                    Datei f&uuml;r den Upload: <input name="userfile" type="file">
                    <input type="submit" value="Datei Upload starten">
                </form>
            </body>
        </html>
        <?php
    }
?>

¬ Tutorials



¬ Insolvenzrecht