Dateiupload
Im folgenden Script wird euch erklärt, wie ihr einen einfachen Dateiupload ermöglicht. Euer Besucher kann dazu von seiner lokalen Festplatte eine Datei auswählen und diese dann auf euren Webspace hochladen. So können Besucher beispielsweise Bilder auf eurer Website hochladen.
Der Upload von Dateien ist nicht ganz ungefährlich. Für weitere Informationen zu den Sicherheitsrisiken schaut euch den Artikel Sicherer Dateiupload an.
Inhaltsverzeichnis
Formular für den Dateiupload
Euer Formular für den Dateiupload kann wie folgt aussehen:
1 2 3 4 |
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="datei"><br> <input type="submit" value="Hochladen"> </form> |
Wichtig ist, dass ihr im Form-Element den enctype setzt. Für das Hochladen einer Datei wählt ihr als type entsprechen file aus. Euer Formular kann auch mehrere file-Inputfelder beinhalten, falls ihr mehrere Dateien gleichzeitig hochladen möchtet. Achten dann dabei aber darauf, dass jedes Feld einen anderen name hat.
Upload-Script
Hochgeladene Dateien befinden sich in der Variable $_FILES. Ähnlich wie $_POST und $_GET könnt ihr so die verschiedenen hochgeladenen Dateien abrufen.
Euer Webserver speichert die hochgeladene Datei unter einem temporären Namen ab. Um nun diese Datei in euren Webspace zu bekommen, müsst ihr diese entsprechend verschieben. Dies geht mittels der Funktion move_uploaded_file(); .
Eure upload.php könnte im einfachsten Fall wie folgt aussehen:
1 |
move_uploaded_file($_FILES['datei']['tmp_name'], 'upload/'.$_FILES['datei']['name']); |
Dies würde die temporäre Datei in das Unterverzeichnis upload verschieben mit dem Originalname der Datei. Achtung, existente Daten werden dabei überschrieben. Ebenfalls müsst ihr, falls ihr dieses auf eurem Webhoster ausführt, darauf achten dass PHP in das Verzeichnis schreiben kann. Ggf. muss das Verzeichnis dafür die Schreibrechte CHMOD 777 besitzen.
Aus Sicherheitsgründen solltet ihr die obige Variante aber nie nutzen, da ein Angreifer so Schadcode hochladen könnte (mehr Infos zum Hintergrund im Artikel Sicherer Dateiupload).
Das $_FILES-Array
Datei-Uploads speichert PHP im $_FILES-Array ab. Je nach Name die ihr dem Input-Feld gegeben habt könnt ihr auf unterschiedliche Informationen im Array $_FILES['name_des_input_felds'] zugreifen:
Variable | Inhalt |
---|---|
$_FILES['datei']['name'] | Der Name der Datei auf dem Rechner des Besuchers |
$_FILES['datei']['tmp_name'] | Temporärer Pfad auf dem Server zur hochgeladenen Datei |
$_FILES['datei']['size'] | Die Größe der Datei in Bytes. |
$_FILES['datei']['type'] | Der MIME-Type der Datei (Achtung: Kann von Angreifer beliebig manipuliert werden). |
Sicherer Bildupload
Ein sicherer Upload für Bilder kann wie folgt aussehen. Dabei wird überprüft, dass wirklich eine Bilddatei hochgeladen wird. Ebenfalls wird die Größe der Datei überprüft um zu große Dateien auszuschließen. Falls bereits ein Bild mit dem Namen vorhanden ist, wird der Name der Datei um eine entsprechende Zahl erweitert.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php $upload_folder = 'upload/'; //Das Upload-Verzeichnis $filename = pathinfo($_FILES['datei']['name'], PATHINFO_FILENAME); $extension = strtolower(pathinfo($_FILES['datei']['name'], PATHINFO_EXTENSION)); //Überprüfung der Dateiendung $allowed_extensions = array('png', 'jpg', 'jpeg', 'gif'); if(!in_array($extension, $allowed_extensions)) { die("Ungültige Dateiendung. Nur png, jpg, jpeg und gif-Dateien sind erlaubt"); } //Überprüfung der Dateigröße $max_size = 500*1024; //500 KB if($_FILES['datei']['size'] > $max_size) { die("Bitte keine Dateien größer 500kb hochladen"); } //Überprüfung dass das Bild keine Fehler enthält if(function_exists('exif_imagetype')) { //Die exif_imagetype-Funktion erfordert die exif-Erweiterung auf dem Server $allowed_types = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF); $detected_type = exif_imagetype($_FILES['datei']['tmp_name']); if(!in_array($detected_type, $allowed_types)) { die("Nur der Upload von Bilddateien ist gestattet"); } } //Pfad zum Upload $new_path = $upload_folder.$filename.'.'.$extension; //Neuer Dateiname falls die Datei bereits existiert if(file_exists($new_path)) { //Falls Datei existiert, hänge eine Zahl an den Dateinamen $id = 1; do { $new_path = $upload_folder.$filename.'_'.$id.'.'.$extension; $id++; } while(file_exists($new_path)); } //Alles okay, verschiebe Datei an neuen Pfad move_uploaded_file($_FILES['datei']['tmp_name'], $new_path); echo 'Bild erfolgreich hochgeladen: <a href="'.$new_path.'">'.$new_path.'</a>'; ?> |
Autor: Nils Reimers