de.comp.lang.php FAQ

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

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

Antwort von Kristian Köhntopp

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.php3" 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 in einer Reihe von globalen Variablen mit dem Namensprefix $probe übermittelt, weil das Input-Element im Formular diesen Namen hat.

$probe

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

$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.

$probe_size

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

$probe_type

Diese Variable enthält den MIME-Type der Datei, so wie er dem Server vom Browser übermittelt worden ist.

Der Upload von Dateien wird durch die beiden Konfigurationsparameter upload_tmp_dir und upload_max_filesize in der php3.ini gesteuert. Und in Windows muss man sich in der php3.ini dringend ein gültiges upload_tmp_dir definieren, bevor das gezeigte Beispiel funktionieren kann. Des weiteren ist es unter Umständen notwendig, die Variable $probe mit der PHP-Funktion stripslashes() zu bearbeiten, bevor man auf sie mit copy() oder einem anderen Befehl zugreift. Dies liegt daran, dass Windows Pfadangaben scheinbar quotet, was der Befehl stripslashes() wieder rückgängig macht. 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. Seit PHP 3.0.10 kann mehr als eine Datei pro Formular hochgeladen werden.

Achtung:

Aufgrund eines Bugs in PHP muss das Script nach dem Upload prüfen, ob sich der/die Name(n) des Datei-Formularfeldes (im folgenden Beispiel probe) in den Hashes $HTTP_GET_VARS, $HTTP_POST_VARS oder $HTTP_COOKIE_VARS befindet. Ist dem so, muss das Script die Weiterverarbeitung (Kopieren) der - angeblich - hochgeladenen Datei(en) verweigern.

Mehr über neue Funktionen zum Upload-Handling der PHP Versionen > 3.0.16 und > 4.0.2 gibt es im Kapitel POST method uploads auf www.php.net.

Vollständiges Beispiel:

<h1>Upload</h1>

<form
  action="<?php print $PHP_SELF ?>"
  method="post"
  enctype="multipart/form-data">
<input type="file" name="probe">
<input type="submit" value="Los!">
</form>
<hr>
<?php
  if (isset($probe)) {

    // Bugfix für: http://www.securityfocus.com/archive/1/80106
    if ( isset($HTTP_COOKIE_VARS["probe"]) ||
         isset($HTTP_POST_VARS  ["probe"]) ||
         isset($HTTP_GET_VARS   ["probe"])
       ) die("Aus Sicherheitsgründen stirbt das Script jetzt.");

    copy($probe, "./newfile.txt");
    printf("Die Datei %s steht jetzt als"
          ." newfile.txt zur Verfügung.<br>\n",
      $probe_name);
    printf("Sie ist %s Bytes groß und vom Typ %s.<br>\n",
      $probe_size, $probe_type);
  }
 ?>
hosted by
schlund + partner

Valid HTML 4.01! Valid CSS!

32.1. Wie funktioniert ein Datei-Upload über HTML-Formulare?
http://www.dclp-faq.de/q/q-formular-upload-php3.html
de.comp.lang.php FAQ | (c) Copyright 2000-2003 Das dclp-FAQ-Team