$_FILES

Geschätzte Lektüre: 8 Minuten 308 Ansichten

Was ist $_FILES?

In PHP ist $_FILES eine superglobale Variable, die verwendet wird, um Dateien zu handhaben, die vom Client (z. B. einem Webbrowser) zum Server hochgeladen werden. Wenn ein Benutzer eine Datei über ein HTML-Formular hochlädt, werden die Informationen über diese Datei in $_FILES gespeichert.

Verbildlichung: Ein Paketlieferdienst: Stellen Sie sich vor, Sie bestellen ein Paket (die hochgeladene Datei) bei einem Online-Shop. Der Lieferdienst ($_FILES) bringt Ihnen nicht nur das Paket selbst, sondern auch ein Begleitschreiben mit wichtigen Informationen:

  • Wie schwer ist das Paket? (size)
  • Wie ist der Paketname? (name)
  • Welcher Lieferdienst war zuständig? (type)
  • Gab es Probleme beim Transport? (error)

2. HTML-Formular für Dateiupload

Bevor wir $_FILES nutzen können, brauchen wir ein HTML-Formular, das Dateien hochlädt.

<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="meine_datei">
    <button type="submit">Hochladen</button>
</form>

Wichtige Attribute:

  • enctype=“multipart/form-data“Muss gesetzt sein, sonst funktioniert der Upload nicht!
  • method=“post“ → Uploads funktionieren nur mit POST.
  • name=“meine_datei“ → Dieser Name wird später in $_FILES verwendet.

Struktur von $_FILES

Wenn eine Datei hochgeladen wird, sieht $_FILES in PHP so aus:

<?php
  print_r($_FILES);
?>

Ausgabe (Beispiel):

Array (
    [meine_datei] => Array (
        [name] => "beispiel.jpg"      // Originaldateiname
        [type] => "image/jpeg"       // MIME-Typ (Dateiformat)
        [tmp_name] => "/tmp/php123.tmp" // Temporärer Speicherort
        [error] => 0                 // Fehlercode (0 = kein Fehler)
        [size] => 1024               // Dateigröße in Bytes
    )
)

Erklärung der Felder:

KeyBedeutungBeispiel
nameOriginaldateinamebeispiel.jpg
typeMIME-Typ (Dateiformat)image/jpeg, application/pdf
tmp_nameTemporärer Pfad auf dem Server/tmp/php123.tmp
errorFehlercode (0 = Erfolg)0 (kein Fehler)
sizeDateigröße in Bytes1024 (1 KB)

Hochgeladene Datei verarbeiten

Nach dem Upload müssen wir die Datei vom temporären Speicher (tmp_name) an einen dauerhaften Ort verschieben.

Beispiel: Bild hochladen und speichern

<?php
if ($_FILES["meine_datei"]["error"] === UPLOAD_ERR_OK) {
    $zielverzeichnis = "uploads/";
    $zielpfad = $zielverzeichnis . basename($_FILES["meine_datei"]["name"]);

    // Verschiebe die Datei vom temporären Pfad ins Zielverzeichnis
    if (move_uploaded_file($_FILES["meine_datei"]["tmp_name"], $zielpfad)) {
        echo "Datei erfolgreich hochgeladen!";
    } else {
        echo "Fehler beim Verschieben der Datei!";
    }
} else {
    echo "Upload-Fehler: " . $_FILES["meine_datei"]["error"];
}
?>

Wichtige Funktionen:
move_uploaded_file() → Verschiebt die Datei an einen festen Speicherort.
basename() → Extrahiert den Dateinamen aus dem Pfad (schützt vor Path Traversal-Angriffen).

Mögliche Fehler (error-Codes)

Der error-Wert in $_FILES gibt an, ob etwas schiefgelaufen ist:

CodeKonstanteBedeutung
0UPLOAD_ERR_OKErfolg
1UPLOAD_ERR_INI_SIZEDatei zu groß (php.ini-Limit)
2UPLOAD_ERR_FORM_SIZEDatei zu groß (Formular-Limit)
3UPLOAD_ERR_PARTIALUpload unvollständig
4UPLOAD_ERR_NO_FILEKeine Datei hochgeladen
6UPLOAD_ERR_NO_TMP_DIRTemporärer Ordner fehlt
7UPLOAD_ERR_CANT_WRITESchreibfehler auf Server

Beispiel: Fehlerbehandlung

<?php
if ($_FILES["meine_datei"]["error"] !== UPLOAD_ERR_OK) {
    switch ($_FILES["meine_datei"]["error"]) {
        case UPLOAD_ERR_INI_SIZE:
            echo "Die Datei ist zu groß (Server-Limit).";
            break;
        case UPLOAD_ERR_NO_FILE:
            echo "Keine Datei ausgewählt.";
            break;
        default:
            echo "Unbekannter Upload-Fehler.";
    }
}
?>

Sicherheitsüberlegungen

Dateityp überprüfen

Nicht jeder sollte jede Datei hochladen dürfen! Beispiel: Nur Bilder erlauben.

$erlaubteTypen = ["image/jpeg", "image/png"];
if (!in_array($_FILES["meine_datei"]["type"], $erlaubteTypen)) {
    die("Nur JPG/PNG-Dateien erlaubt!");
}

Dateinamen bereinigen

Nutzer könnten schädliche Dateinamen hochladen (z. B. ../../../virus.exe).

$sichererName = preg_replace("/[^a-zA-Z0-9\.\-_]/", "", $_FILES["meine_datei"]["name"]);

Maximale Dateigröße festlegen

$maxGroesse = 2 * 1024 * 1024; // 2 MB
if ($_FILES["meine_datei"]["size"] > $maxGroesse) {
    die("Datei zu groß! Maximal 2 MB erlaubt.");
}

Praxisbeispiel: Profilbild-Upload

<?php
if ($_SERVER["REQUEST_METHOD"] === "POST") {
    $zielverzeichnis = "profile_pics/";
    $dateiInfo = $_FILES["profilbild"];

    // Überprüfe Fehler
    if ($dateiInfo["error"] !== UPLOAD_ERR_OK) {
        die("Upload-Fehler: " . $dateiInfo["error"]);
    }

    // Nur Bilder erlauben
    $erlaubteTypen = ["image/jpeg", "image/png"];
    if (!in_array($dateiInfo["type"], $erlaubteTypen)) {
        die("Nur JPG/PNG-Dateien erlaubt!");
    }

    // Maximal 1 MB
    if ($dateiInfo["size"] > 1 * 1024 * 1024) {
        die("Datei zu groß! Maximal 1 MB erlaubt.");
    }

    // Umbenennen (z. B. user123.jpg)
    $neuerName = "user_" . time() . ".jpg";
    $zielpfad = $zielverzeichnis . $neuerName;

    // Verschiebe die Datei
    if (move_uploaded_file($dateiInfo["tmp_name"], $zielpfad)) {
        echo "Profilbild erfolgreich hochgeladen!";
    } else {
        echo "Fehler beim Speichern der Datei.";
    }
}
?>

Zusammenfassung

  • $_FILES speichert Informationen über hochgeladene Dateien.
  • Wichtigste Felder: name, type, tmp_name, error, size.
  • Sicherheit ist kritisch! → Dateityp, Größe und Namen überprüfen.
  • move_uploaded_file() verschiebt die Datei an den endgültigen Speicherort.
Dieses Dokument teilen

$_FILES

Oder Link kopieren

INHALT

Abonnieren

×
Cancel