Dateiuploads mit POST
PHP kann Dateiuploads mit jedem RFC-1867 konformen Browser
(dazu gehören der Netscape Navigator 3 oder höher, Microsoft
Internet Explorer 3 mit einem Patch von Microsoft oder höher
ohne Patch) durchführen. Es können sowohl Text- als auch
Binärdaten hochgeladen werden. Mit PHP´s Authentifizierungs-
und Dateifunktionen besteht volle Kontrolle darüber, wer
Dateien hochladen darf und was mit den Dateien geschehen soll,
wenn der Upload beendet ist.
Hinweis:
Diesbezügliche Konfigurationshinweise
Siehe auch die Anweisungen
file_uploads,
upload_max_filesize,
upload_tmp_dir und
post_max_size in der php.ini
PHP unterstützt auch Dateiuploads nach der PUT-Methode, die
beispielsweise vom Netscape Composer und den W3C Amaya
Clients benutzt wird. Siehe dazu PUT-Unterstützung
für nähere Informationen.
Eine Maske für den Dateiupload kann erstellt werden, indem man
ein Formular entwirft, das ungefähr so aussieht:
Beispiel #1 Formular für den Dateiupload
<form enctype="multipart/form-data" action="_URL_" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form>
"_URL_" im obigen Beispiel sollte durch den 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. Es ist auch wichtig
dass in ihrem Formular enctype="multipart/form-data"
angegeben ist da die Dateiübertragung nur so funktioniert.
Warnung
Die maximale Dateigröße MAX_FILE_SIZE ist für den Browser nur
ein Hinweis und es ist leicht, diese Grenze zu umgehen. Also
verlassen Sie sich nicht darauf, dass der Browser Ihrem Wunsch
auch nachkommt! Wie auch immer, die PHP-Einstellungen für die
maximale Dateigröße können nicht getäuscht werden.
Sie sollten aber MAX_FILE_SIZE trotzdem nutzen da es Nutzer
davor bewahrt zunächst auf die Übertragung der Daten zu warten
um dann erst herauszufinden das diese zu groß waren.
Die für hochgeladene Dateien definierten Variablen sind je nach
PHP Version und Konfiguration verschieden. Die Autoglobale
$_FILES existiert
seit PHP 4.1.0 und das Array $HTTP_POST_FILES
seit PHP 4.0.0. Diese Arrays enthalten alle Informationen über
Ihre hochgeladenen Dateien. Die Verwendung von
$_FILES wird bevorzugt. Ist die PHP Anweisung
register_globals auf
on, stehen auch entsprechende Variablennamen
zur Verfügung. Seit PHP
4.2.0
steht register_globals
standardmäßig auf off.
Im Folgenden sind die Inhalte von
$_FILES aus unserem
Beispielskript 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 genutzt werden.
-
$_FILES['userfile']['name']
-
Der ursprüngliche Dateiname auf der Client Maschine.
-
$_FILES['userfile']['type']
-
Der Mime-Type der Datei, falls der Browser diese Information
zur Verfügung gestellt hat. Ein Beispiel wäre
"image/gif".
-
$_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
im Zusammenhang mit dem hochladen der Datei.
['error'] wurde in PHP 4.2.0 eingeführt.
Hinweis:
In den Versionen vor PHP 4.1.0 war dies
$HTTP_POST_FILES, und ist keine
'Autoglobale'
Variable wie $_FILES. PHP 3 unterstützt
$HTTP_POST_FILES nicht.
Ist register_globals
in der php.ini aktiviert, stehen zusätzliche Variablen zur Verfügung.
Zum Beispiel entspricht $userfile_name
$_FILES['userfile']['name'],
$userfile_type entspricht
$_FILES['userfile']['type'], etc. Beachten Sie,
dass register_globals standardmäßig deaktiviert ist, jedoch wird
empfohlen, sich nicht darauf zu verlassen.
Standardmäßig werden Dateien in dem vorgegebenen 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
// In PHP kleiner als 4.1.0 sollten Sie $HTTP_POST_FILES anstatt
// $_FILES verwenden. In PHP kleiner als 4.0.3 verwenden Sie copy()
// und is_uploaded_file() anstatt von move_uploaded_file()
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir. $_FILES['userfile']['name'];
print "<pre>";
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
print "File is valid, and was successfully uploaded.";
print "Here's some more debugging info:\n";
print_r($_FILES);
} else {
print "Possible file upload attack! Here's some debugging info:\n";
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'] benutzen,
um zu kleine bzw. zu große Dateien wegzuwerfen. Sie können
$_FILES['userfile']['type'] nutzen, um Dateien
eines unerwünschten Typs wegzuwerfen. Seit PHP 4.2.0 können Sie Ihre
Logik auch mittels $_FILES['userfile']['error']
anhand der Fehlercodes
planen. Egal welche Logik Sie verwenden, Sie sollten die Datei in dem
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.