Dateiuploads mit POST
   
    Dieses Feature erlaubt es Benutzern sowohl Text- als auch Binärdaten
    hochzuladen. Mit PHP's Authentifizierungs- und Dateifunktionen besteht
    volle Kontrolle darüber, wer Dateien hochladen darf und was mit den
    Dateien geschehen soll, wenn das Hochladen beendet ist.
   
   
    PHP kann Dateiuploads von jedem RFC-1867-konformen Browser empfangen.
   
   Hinweis: 
    Diesbezügliche Konfigurationshinweise
    
     Siehe auch die Anweisungen
     file_uploads,
     upload_max_filesize,
     upload_tmp_dir,
     post_max_size und
     max_input_time
     in der php.ini
    
   
   
    PHP unterstützt auch das Hochladen von Dateien nach der PUT-Methode, die
    beispielsweise vom Netscape Composer und den
    W3C-Amaya-Clients verwendet wird. Siehe dazu
    PUT-Unterstützung
    für nähere Informationen.
   
   
    
     Beispiel #1 Formular zum Hochladen von Dateien
     
      Um Dateieuploads zu ermöglichen muss ein Formular erstellt werden,
      welches ungefähr wie folgt aussieht:
     
<!-- Der Kodierungstyp enctype MUSS wie dargestellt angegeben werden -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE muss vor dem Datei-Eingabefeld stehen -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Der Name des Eingabefelds bestimmt den Namen im $_FILES-Array -->
    Diese Datei hochladen: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
</form>
 
     
      __URL__ im obigen Beispiel sollte durch die URL eines
      PHP-Skripts ersetzt werden.
     
      Das "hidden"-Feld MAX_FILE_SIZE muss dem
      "file"-Eingabefeld vorangestellt werden; der angegebene Wert bestimmt
      die maximale akzeptierte Dateigröße in Bytes. Dieses Formular-Element
      sollte immer benutzt werden, da es dem Benutzer erspart auf einen großen
      Dateiupload zu warten, nur um festzustellen, dass die Datei zu groß war
      und der Upload fehlgeschlagen ist. Es sollte jedoch beachtet werden,
      dass diese Browserseitige Einstellung sehr einfach zu umgehen ist und
      man sich daher niemals darauf verlassen sollte, dass sie übergroße
      Dateiuploads verhindert. Die Server-seitige Option für die Maximalgröße
      kann hingegen nicht umgangen werden.
     
 
   
   Hinweis: 
    
     Das Uploadformular muss unbedingt das Attribut
     enctype="multipart/form-data" angeben, andernfalls
     wird der Upload nicht funktionieren.
    
   
   
    Die globale Variable $_FILES enthält alle Informationen
    über hochgeladene Dateien. Im Folgenden sind ihre Inhalte für das obige
    Beispielformular aufgelistet. Beachten Sie, dass dies auf der Annahme
    basiert, dass der Name des Dateiuploads wie in dem obigen Beispielskript
    userfile ist. Es kann aber auch jeder andere Name
    verwendet werden.
    
     
      - $_FILES['userfile']['name']
- 
       
        Der ursprüngliche Dateiname auf dem Computer des Benutzers.
        
- $_FILES['userfile']['type']
- 
       
        Der MIME-Type der Datei, falls der Browser diese Information zur
        Verfügung gestellt hat. Ein Beispiel wäre
        "image/gif". Dieser MIME-Type wird jedoch nicht von
        PHP geprüft und kann somit falsch sein.
 
- $_FILES['userfile']['size']
- 
       
        Die Größe der hochgeladenen Datei in Bytes.
        
- $_FILES['userfile']['tmp_name']
- 
       
        Der temporäre Dateiname, unter dem die hochgeladene Datei auf dem
        Server gespeichert wurde.
        
- $_FILES['userfile']['error']
- 
       
        Der Fehlercode des
        Uploads.
        
- $_FILES['userfile']['full_path']
- 
       
        Der vollständige Pfad, wie er vom Browser übermittelt wurde. Dieser
        Wert enthält nicht immer eine echte Verzeichnisstruktur und ist daher
        nicht vertrauenswürdig.
        Verfügbar ab PHP 8.1.0.
        
    Standardmäßig werden Dateien im standardmäßigen temporären Verzeichnis des
    Servers gespeichert, außer es wurde mittels upload_tmp_dir in der php.ini ein
    anderer Ort konfiguriert. Das Standardverzeichnis des Servers kann durch
    das Setzen der Umgebungsvariablen TMPDIR in der Umgebung,
    in der PHP ausgeführt wird, geändert werden. Das Setzen mittels der
    Funktion putenv() innerhalb eines Skriptes ist nicht
    möglich. Mittels dieser Umgebungsvariable kann auch sichergestellt werden,
    dass auch andere Operationen an hochgeladenen Dateien arbeiten können.
    
     Beispiel #2 Dateiuploads prüfen
     
      Weitere Informationen finden Sie auch in den Beschreibungen für
      is_uploaded_file() und
      move_uploaded_file(). Das folgende Beispiel
      verarbeitet einen von einem HTML-Formular kommenden Dateiupload.
     
<?php
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    echo "Datei ist valide und wurde erfolgreich hochgeladen.\n";
} else {
    echo "Möglicherweise eine Dateiupload-Attacke!\n";
}
echo 'Weitere Debugging Informationen:';
print_r($_FILES);
print "</pre>";
?>
      
     
   
   
    Das die hochgeladene Datei empfangende Skript sollte die notwendige Logik
    zur Entscheidung enthalten, was mit der hochgeladenen Datei geschehen
    soll. Sie können zum Beispiel
    $_FILES['userfile']['size'] verwenden, um zu kleine
    bzw. zu große Dateien wegzuwerfen. Sie können
    $_FILES['userfile']['type'] nutzen, um Dateien eines
    unerwünschten Typs wegzuwerfen, sollten dabei jedoch beachten, dass dieser
    Wert vollständig vom Benutzer kontrolliert wird und somit falsch sein
    kann. Sie können Ihre Logik auch mittels
    $_FILES['userfile']['error'] anhand der
    Fehlercodes planen.
    Egal welche Logik Sie verwenden, Sie sollten die Datei im temporären
    Verzeichnis entweder löschen, oder an einen anderen Ort verschieben.
   
   
    Wenn im Formular keine Datei ausgewählt wurde so wird
    $_FILES['userfile']['size'] von PHP auf 0 gesetzt und
    $_FILES['userfile']['tmp_name'] ist leer.
   
   
    Wurde die Datei in dem temporären Verzeichnis nicht verschoben oder
    umbenannt, wird sie am Ende des Requests gelöscht.
   
   
    Beispiel #3 Hochladen eines Arrays von Dateien
     
      PHP unterstützt HTML Arrays
      auch für Dateien.
     
<form action="" method="post" enctype="multipart/form-data">
<p>Pictures:
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="file" name="pictures[]" />
<input type="submit" value="Send" />
</p>
</form>
 
     
<?php
foreach ($_FILES["pictures"]["error"] as $key => $error) {
    if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["pictures"]["tmp_name"][$key];
        // basename() kann Directory Traversal Angriffe verhindern; weitere
        // Gültigkeitsprüfung/Bereinigung des Dateinamens kann angebracht sein
        $name = basename($_FILES["pictures"]["name"][$key]);
        move_uploaded_file($tmp_name, "data/$name");
    }
}
?>
      
     
   
    Eine Fortschrittsanzeige für Dateiuploads kann mittels
    Session Upload Progress
    implementiert werden.