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.
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 19-1. Formular für den Dateiupload <form enctype="multipart/form-data" action="_URL_" method="post">
<input type="hidden" name="MAX_FILE_SIZE" value="1000">
Send this file: <input name="userfile" type="file">
<input type="submit" value="Send File">
</form> |
|
Die _URL_ sollte auf eine PHP-Datei verweisen. Das versteckte Feld
MAX_FILE_SIZE muss dem Dateieingabefeld vorangestellt werden und den
Wert der maximal akzeptierten Dateigröße in Bytes enthalten.
| 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.
|
Die für hochgeladene Dateien definierten Variablen sind je nach
PHP Version und Konfiguration verschieden. Die folgenden Variablen
werden nach einem erfolgreichen Upload innerhalb des empfangenden
Skriptes definiert. Ist track_vars
aktiviert, ist das $HTTP_POST_FILES bzw. $_FILES Array initialisiert.
Wenn register_globals
aktiviert ist, können die entsprechenden Variablen auch als globale
Variablen initialisiert werden, auch wenn dies nicht mehr nicht mehr
empfohlen wird.
Anmerkung:
track_vars ist seit PHP
4.0.3 immer aktiviert, und seit PHP 4.1.0 kann $_FILES statt
$HTTP_POST_FILES verwendet werden.
$_FILES ist immer global, weshalb Sie
global für $_FILES innerhalb von Funktionen
vermeiden sollten.
$HTTP_POST_FILES/$_FILES
beinhalten die Dateiinformationen des Uploads.
Im Folgenden sind die Inhalte von $HTTP_POST_FILES
unter der Annahme, dass der Name des Dateiuploads wie in dem obigen
Beispielskript 'userfile' ist, aufgelistet:
- $HTTP_POST_FILES['userfile']['name']
Der ursprüngliche Dateiname auf der Client Maschine.
- $HTTP_POST_FILES['userfile']['type']
Der Mime-Type der Datei, falls der Browser diese Information
zur Verfügung gestellt hat. Ein Beispiel wäre
"image/gif".
- $HTTP_POST_FILES['userfile']['size']
Die Größe der hochgeladenen Datei in Bytes.
- $HTTP_POST_FILES['userfile']['tmp_name']
Der temporäre Dateiname, unter dem die hochgeladene Datei auf
dem Server gespeichert wurde.
Anmerkung:
Seit PHP 4.1.0 wird auch die Kurzform $_FILES
unterstützt. PHP 3 unterstützt $HTTP_POST_FILES
nicht.
Wenn register_globals
in der php.ini aktiviert ist, stehen unter der
Annahme, dass der Name des Dateiuploads wie in dem obigen Beispielskript
'userfile' ist, zur Verfügung:
$userfile - Der temporäre Name, unter dem die
hochgeladene Datei auf dem Server gespeichert wurde.
$userfile_name - Der ursprüngliche Dateiname
auf dem System des Absenders.
$userfile_size - Größe der hochgeladenen
Datei in Bytes.
$userfile_type - Der Mime-Type der Datei, falls
der Browser diese Information zur Verfügung gestellt hat. Ein
Beispiel wäre "image/gif".
Beachten Sie, dass der Teil "
$userfile" der
obigen Variablen den Namen des Dateifeldes <input name="userfile"
type="file"> im Uploadformular trägt. In dem obigen Beispiel
haben wir es "userfile" genannt.
Anmerkung:
register_globals = On wird aus Sicherheits- und
Performancegründen nicht empfohlen.
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 19-2. Dateiuploads prüfen
Die folgenden Beispiele sind für PHP Versionen größer als PHP
4.0.2. Funktionsbeschreibungen finden Sie für
is_uploaded_file() und
move_uploaded_file().
<?php
// In PHP 4.1.0 oder höher sollte $_FILES anstatt $HTTP_POST_FILES verwendet werden.
if (is_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'])) {
copy($HTTP_POST_FILES['userfile']['tmp_name'], "/place/to/put/uploaded/file");
} else {
echo "Possible file upload attack. Filename: " . $HTTP_POST_FILES['userfile']['name'];
}
/* ...oder... */
move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], "/place/to/put/uploaded/file");
?> |
|
Das die hochgeladene Datei empfangene Skript jegliche, für den
Zweck der hochgeladenen Datei nötige Logik enthalten. Sie können
zum Beispiel $HTTP_POST_FILES['userfile']['size']
benutzen, um zu kleine bzw. zu große Dateien wegzuwerfen. Sie können
$HTTP_POST_FILES['userfile']['type'] nutzen, um
Dateien eines unerwünschten Typs wegzuwerfen. Egal welche Logik Sie
verwenden, Sie sollten die Datei in dem temporären Verzeichnis
entweder löschen, oder an einen anderen Ort verschieben.
Wurde die Datei in dem temporären Verzeichnis nicht verschoben oder
umbenannt, wird sie am Ende des Requests gelöscht.