de.comp.lang.php.* FAQ

11.11. Wie funktioniert ein Datei-Upload über HTML-Formulare?

Keywords: Datei | Upload | input | POST | enctype | HTML

Antwort von Kerry W. Lothrop

Ein Upload-Formular muss ein Input-Element enthalten, das den Typ file hat. Da Dateien in einem Upload prinzipiell beliebig groß werden können, muss die Übermittlung des Formulares mit der Methode POST erfolgen. Außerdem muss ein bestimmter ENCTYPE für das Formular angegeben werden. Ein solches Formular kann von Netscape Navigator ab Version 3 und von Microsoft Internet Explorer ab Version 4 verarbeitet werden.

<h1>Hallo</h1>
<form action="/submit.php" method="post"
      enctype="multipart/form-data">
<input type="file" name="probe" />
<input type="submit" value="los" />
</form>

Das empfangende PHP-Script bekommt das Resultat des Datei-Uploads als assoziatives Array mit dem Namen $_FILES['probe'] (bzw. bei PHP 4.0.0 bis 4.0.6 $HTTP_POST_FILES['probe']) übermittelt, weil das Input-Element im Formular diesen Namen hat.

$_FILES['probe']['tmp_name']

Diese Variable enthält den Namen der Datei in einem temporären Verzeichnis auf dem Server. Sie kann von dort mit einem move_uploaded_file() -Aufruf abgeholt werden. Das ist auch notwendig, da die Originaldatei am Ende des Scriptes automatisch gelöscht wird.

$_FILES['probe']['name']

Diese Variable enthält den Namen der Datei auf dem System des Anwenders. Der genaue Dateiname mit evtl. vorhandenen Laufwerksbuchstaben, Pfadseparatoren und anderen Sonderzeichen ist betriebssystemabhängig und das empfangende Script sollte keine Annahmen hierüber machen.

$_FILES['probe']['size']

Diese Variable enthält die Länge der Datei auf dem Server in Bytes.

$_FILES['probe']['type']

Diese Variable enthält den MIME-Type der Datei, so wie er dem Server vom Browser übermittelt worden ist. Dieser Wert kann unter Umständen nicht richtig sein, je nach Einstellung des Browsers. Beim Ermitteln des Typs von hochgeladenen Grafiken sollte stattdessen die Funktion getimagesize() verwendet werden.

$_FILES['probe']['error']

Diese Variable wurde mit PHP 4.2.0 eingeführt und enthält den Status des Dateiuploads. Die möglichen Werte und dazugehörige Konstanten in neueren PHP-Versionen sind im Handbuch aufgeführt.

Der Upload von Dateien wird durch die drei Konfigurationsparameter file_uploads , upload_tmp_dir und upload_max_filesize gesteuert. Außerdem relevant sind die drei Parameter memory_limit , post_max_size und max_execution_time . Der Pfad zu upload_tmp_dir muss absolut angegeben werden.

PHP legt die temporäre Datei in dem angegebenen Verzeichnis an und löscht sie am Ende des Scriptes wieder. Die Datei darf maximal die angegebene Größe haben. Ein Einstellen der Größenbegrenzung begrenzt jedoch nicht wirklich den Plattenplatz, der auf dem Server von PHP durch Fileupload verbraucht wird: Aus technischen Gründen muss PHP die Datei zunächst empfangen und kann sie erst dann verwerfen, wenn sie zu groß ist. Es kann auch mehr als eine Datei pro Formular hochgeladen werden (siehe Wie kann ich mehrere Dateien auf einmal uploaden?).

Achtung:

Das Kopieren der hochgeladenen Datei mit Hilfe von copy() und das Verwenden der alten, auf globalen Variablen beruhenden Version sollte wo möglich aus Sicherheitsgründen vermieden werden.

Vollständiges Beispiel:

<h1>Upload</h1>

<form
  action="<?php echo $_SERVER['PHP_SELF']; ?>"
  method="post"
  enctype="multipart/form-data">
<input type="file" name="probe" />
<input type="submit" value="Los!" />
</form>
<hr />
<?php
  if (isset($_FILES['probe']) and ! $_FILES['probe']['error']) {
    // Alternativ:            and   $_FILES['probe']['size']
    move_uploaded_file($_FILES['probe']['tmp_name'], "./newfile.txt");
    printf("Die Datei %s steht jetzt als " .
          "newfile.txt zur Verfügung.<br />\n",
      $_FILES['probe']['name']);
    printf("Sie ist %u Bytes groß und vom Typ %s.<br />\n",
      $_FILES['probe']['size'], $_FILES['probe']['type']);
  }
 ?>

Bei PHP3 muss über eine alternative Syntax auf die hochgelade Datei zugegriffen werden (siehe Wie funktioniert ein Datei-Upload über HTML-Formulare bei PHP 3?).

Valid HTML 4.01! Valid CSS!

11.11. Wie funktioniert ein Datei-Upload über HTML-Formulare?
http://www.php-faq.de/q/q-formular-upload-php4.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team