Tutorial: Datei-Upload mit PHP in ein Verzeichnis

Es gibt mehrere Möglichkeiten mit PHP eine Datei von einem lokalen Rechner aus auf seinen Webserver hochzuladen. Dieses Tutorial lädt eine Bilddatei in einen Ordner auf einen Webserver hoch, funktioniert mit ein paar Anpassungen aber natürlich für alle Dateitypen.

Bevor wir uns das PHP-Script ansehen, braucht es ein wenig Vorarbeit. Zuerst muss der Ordner auf dem Webserver angelegt werden, in dem die Datei schließlich landen soll. Dieser Ordner sollte innerhalb des Verzeichnisses liegen, in dem wir auch unsere PHP Dateien speichern und für den Aufruf durch einen Browser bereitstellen. Der Einfachheit halber heißt der Ordner in diesem Beispiel upload.

Als zweites müssen wir natürlich ein Formular schreiben, damit ein User überhaupt eine Datei hochladen kann. Diese speichern wir als index.php ab.

<html>
<head>
    <title>DateiUpload</title>
    <meta charset="utf-8">
</head>
<body>

<form action="upload.php" method="post" enctype="multipart/form-data">
   <input type="file" name="file">
   <input type="submit" name="submit" value="Datei hochladen">

</body>
</html>

Jetzt zum eigentlichen PHP-Script. Wie oben unter action=“upload.php“ angedeutet, müssen wir es unter dem Dateinamen upload.php abspeichern.

Das Script lädt aber nicht nur eine Datei hoch, es fragt auch einige Bedingungen ab. Zum Beispiel wollen wir in diesem Fall nur Bilder haben, also beschränken wir uns auf die Dateitypen jpg, png & gif. Das Bild darf nicht zu groß sein, sondern muss kleiner als 500kb sein. Außerdem ist in dem Script noch eine Sicherung eingebaut, falls zwei Nutzer ein Bild mit dem gleichem Namen und Dateityp hochladen wollen. Statt aber auszugeben, dass der Dateiname bereits vergeben ist, werden die hochgeladenen Bilder mit einer eindeutigen ID versehen und umbenannt.

<?php

if (isset($_POST['submit'])) {

    # Informationen über die Datei erfahren
    $file = $_FILES['datei'];
    # Dateiname:
    $fileName = $_FILES['datei']['name'];
    # Dateigröße:
    $fileSize = $_FILES['datei']['size'];
    # DateiType
    $fileType = $_FILES['datei']['type'];
    # temporärer Speicherort der Datei:
    $fileTmpName = $_FILES['datei']['tmp_name'];
    # Error (hochgeladen: 0; nicht hochgeladen: 1)
    $fileError = $_FILES['datei']['error'];

    # Es sollen nur Bilder hochladen werden

    # Teilt den Inhalt der Variable fileName in einen
    # Teil vor dem Punkt und einen danach auf
    $fileExt = explode('.', $fileName);
    # strtolower besteht darauf, das der Inhalt in
    # Kleinbuchstaben geschrieben ist, also nicht JPG
    # end greift in dem oben erzeugten Array auf
    # den letzten Teil zu
    $fileActualExt = strtolower(end($fileExt));

    # Welche Dateien sollen hochgeladen werden dürfen?
    $allowed = array('jpg', 'jpeg', 'png', 'gif');

    # Prüfen, ob die hochzuladende Datei auch erlaubt ist:
    # Geprüft wird, ob $fileActualExt in dem Array $allowed
    # vorhanden ist
    if (in_array($fileActualExt, $allowed)){

        # Liegt ein Error vor
        if ($fileError === 0) {

            # Maximale Dateigröße festlegen (hier 500kb)
            if($fileSize < 500000) {

            # Sicherstellen, dass eine Datei mit einem
            # vorhandenen Namen nicht überschrieben wird,
            # indem die hochgeladene Datei umbenannt wird.
            $fileNameNew = uniqid('', true).".".$fileActualExt;

            # Der Zielort wird festgelegt:
            $fileDesitination = 'upload/'.$fileNameNew;
            # Die Datei wird vom tempäreren Speicherort in             # Ordner verschoben wird.
          move_uploaded_file($fileTmpName, $fileDesitination);

            # Ausgabe der Erfolgsmeldung auf der Uploadseite
            header("Location: index.php?uploadsuccess");

            } else {
                echo "Die Datei überschreitet die max. Größe";
            }

        } else {
            echo "Beim Hochladen ist ein Fehler aufgetreten";
        }

    } else {
        echo "Dieser Dateityp ist nicht erlaubt";
    }
}

Nach einem erfolgreichen Upload wird der Nutzer also wieder auf die index.php geschickt. In der URL kann er dann am Ende der Adresse ?uploadsuccess lesen.

Zum Abschluss vielleicht noch ein Wort zum Thema temporärer Speicherort. Dabei handelt es sich um ein temporäres Verzeichnis, in dem die Datei so lange abgelegt ist, bis sie fertig bearbeitet wurde. Danach wird sie endgültig in ihren Zielordner verschoben.

Teilen macht Freude.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.