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
.
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
18-1
.
Formular
für
den
Dateiupload
|
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
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
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
.
-
$_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
.
Anmerkung
:
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(
)
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
18-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
/
'
;
print
"
pre
"
;
if
(move_uploaded_file($_FILES['userfile']['tmp_name']
,
$uploaddir
.
$_FILES['userfile']['name'])
)
{
print
"File
is
valid
,
and
was
successfully
uploaded
.
|
|
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
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
.
Wurde
die
Datei
in
dem
temporären
Verzeichnis
nicht
verschoben
oder
umbenannt
,
wird
sie
am
Ende
des
Requests
gelöscht
.