Met de POST methode uploaden
PHP
kan
'
file
uploads
'
van
elke
RFC-1867
ondersteunende
webbrowser
(Dit
zijn
o.a
.
Netscape
Navigator
3
+
en
Microsoft
IE
3+
)
.
Dit
maakt
het
mogelijk
voor
mensen
om
text
en
binary
bestanden
te
uploaden
.
Met
behulp
van
allerlei
PHP-functies
heb
je
volledige
controle
over
wie
er
mag
uploaden
,
en
over
het
ge-uploade
bestand
zelf
.
PHP
ondersteunt
ook
de
PUT-methode
voor
bestand
uploads
.
Dit
wordt
onder
andere
gebruikt
door
Netscape
Composer
en
programma'
s
die
W3C
's
Amaya
gebruiken
.
Zie
PUT
Methode
Ondersteuning
voor
meer
details
.
Een
'
bestands
upload
'
scherm
kan
gemaakt
worden
met
een
speciaal
form
die
er
zo
uit
ziet
:
Voorbeeld
18-1
.
Bestand
Upload
Form
form
enctype="
multipart
/
form-data
"
action="_URL_
"
method="post
"
input
type="hidden
"
name="MAX_FILE_SIZE
"
value="1000
"
Upload
dit
bestand
:
input
name="userfile
"
type="file
"
input
type="submit
"
value="Upload
!
"
/
form
|
|
De _URL_ moet naar een PHP bestand wijzen. Het MAX_FILE_SIZE
'hidden' veld moet VOOR het 'file input' veld komen en de
waarde hiervan wordt gebruikt als de maximaal toegestane
grootte van het bestand dat geupload wordt. Deze waarde is in
bytes.
Waarschuwing
|
De
MAX_FILE_SIZE
is
een
'
advies
'
aan
de
browser
.
Het
is
niet
moeilijk
om
deze
te
omzeilen!
!
Reken
er
dus
niet
op
dat
het
werkt..
.
De
PHP-setting
voor
maximum-size
is
daarentegen
niet
te
omzeilen
.
|
De
variabelen
voor
geuploade
bestanden
kunnen
verschillen
,
dit
kan
liggen
aan
de
PHP-versie
en
de
configuratie
:
De
autoglobal
$_FILES
bestaat
sinds
PHP
4.1.0
,
terwijl
de
$HTTP_POST_FILES
array
al
bestaat
sinds
PHP
4.0.0
.
Deze
arrays
bevatten
alle
informatie
over
het
geuploade
bestand
.
Het
gebruik
van
$_FILES
wordt
aangeraden
.
Als
register_globals
aan
staat
,
zullen
gerelaeerde
variabelen
ook
bestaan
.
register_globals
staat
standaard
uit
sinds
PHP
4.2.0
.
De
inhoud
van
de
$_FILES
array
van
het
voorgaande
voorbeeld
is
als
volgt
:
(
dit
gaat
uit
van
userfile
,
zoals
gebruikt
in
het
voorgaande
voorbeeld
)
-
$_FILES['userfile']['name']
-
De
(
gegeven
)
naam
van
de
geuploade
file
.
-
$_FILES['userfile']['type']
-
De
mime-type
van
het
bestand
,
zoals
gegeven
door
de
browser
.
(
Het
kan
voorkomen
dat
geen
mime-type
wordt
gegeven
,
of
een
verkeerde
wordt
gegeven
)
The
mime
type
of
the
file
,
if
the
browser
provided
this
Een
voorbeeld
hiervan
zou
kunnen
zijn
"image
/
gif
"
.
-
$_FILES['userfile']['size']
-
De
bestandsgrootte
in
bytes
.
-
$_FILES['userfile']['tmp_name']
-
De
tijdelijke
naam
van
het
bestand
,
dit
is
ook
de
plaats
waar
het
bestand
tijdelijk
is
opgeslagen
totdat
het
script
er
iets
mee
doet
.
Dit
bestand
wordt
weggehaald
zodra
het
script
eidigt
.
-
$_FILES['userfile']['error']
-
De
error
code
ge-associeerd
met
deze
bestands-upload
.
[
'error'
]
bestaat
pas
sinds
PHP
4.2.0
Opmerking
:
In
PHP
versies
voor
4.1.0
heette
deze
array
nog
$HTTP_POST_FILES
,
ook
was
het
geen
autoglobal
zoals
$_FILES
In
PHP
versies
voor
4.1.0
heette
deze
array
nog
$HTTP_POST_FILES
,
ook
was
het
geen
autoglobal
zoals
$_FILES
is
.
PHP
3
maakt
geen
gebruik
van
$HTTP_POST_FILES
,
noch
van
$_FILES
.
Als
register_globals
aan
staat
in
php.ini
,
zijn
er
extra
variabelen
beschikbaar
.
Bij
voorbeeld
,
$userfile_name
zal
dan
gelijk
zijn
aan
$_FILES[
'userfile']['name'
]
,
$userfile_type
zal
gelijk
zijn
aan
$_FILES['userfile']['type'
]
,
etc
.
Sinds
PHP
4.2.0
staat
register_globals
standaard
uit
.
Het
is
dus
niet
aan
te
raden
om
te
vertrouwen
op
het
bestaan
van
deze
variabelen
.
Ge-uploade
bestanden
worden
standaard
in
de
standaard
tijdelijke
directory
van
de
server
opgeslagen
,
tenzij
er
een
andere
locatie
is
opgegeven
met
het
upload_tmp_dir
directive
in
php.ini
.
De
standaard
tijdelijke
directory
kan
worden
veranderd
worden
door
de
'
environment
'
variable
(
TMPDIR
)
te
veranderen
in
het
'environment
'
waar
PHP
in
draait
.
Dit
kan
niet
in
een
script
mbv
de
putenv(
)
functie
gedaan
worden
.
Deze
'
environment
'
variable
kan
ook
gebruikt
worden
om
zeker
te
weten
dat
bepaalde
andere
bewerkingen
op
alle
ge-uploade
bestanden
werken
.
Voorbeeld
18-2
.
De
volgende
voorbeelden
werken
alleen
met
PHP
versies
4.0.2
en
hoger
.
Zie
ook
:
is_uploaded_file(
)
en
move_uploaded_file(
)
.
?php
/
/
Voor
PHP
4.1.0
moet
$HTTP_POST_FILES
gebruikt
worden
in
plaats
van
$_FILES
.
if
(
is_uploaded_file($_FILES['userfile']['tmp_name'])
)
{
copy($_FILES['userfile']['tmp_name']
,
"
/
plaats
/
om
/
heen
/
te
/
verplaatsen")
;
}
else
{
echo
"Mogelijke
aanval
gespot
:
"
.
$_FILES['userfile']['name']
;
}
/
*
...of..
.
*
/
move_uploaded_file($_FILES['userfile']['tmp_name']
,
"
/
plaats
/
om
/
heen
/
te
/
verplaatsen")
;
?
|
|
Het
script
dat
het
bestand
ontvangt
moet
zo
veel
mogelijk
zijn
best
doen
om
het
bestand
goed
te
plaatsen
.
Je
kan
bijvoorbeeld
$_FILES[
'userfile']['size'
]
gebruiken
om
te
grote
of
te
kleine
bestanden
te
verwerpen
.
Je
kan
$_FILES[
'userfile']['type'
]
gebruiken
om
bepaalde
typen
bestanden
niet
door
te
laten
.
Sinds
PHP
4.2.0
,
kan
je
ook
$_FILES[
'userfile']['error'
]
gebruiken
met
behulp
van
error
codes
.
Het
maakt
niet
uit
wat
je
verzint
,
om
het
bestand
te
behouden
,
moet
het
óf
hernoemd
zijn
,
of
verplaatst
Als
geen
van
beiden
heeft
plaatsgevonden
,
zal
het
bestand
aan
het
einde
van
het
proces
,
intern
verwijderd
worden
.