Uploading metodou POST
PHP umožňuje zpracování uploadu souborů z jakéhokoli prohlížeče
vyhovujícího RFC-1867 (což zahrnuje mj. Netscape Navigator 3 a pozdější,
Microsoft Internet Explorer 3 se záplatou od Microsoftu, nebo pozdější
bez záplaty). Tato schopnost umožňuje lidem uploadovat textové i
binární soubory. S autentizací poskytovanou PHP a s funkcemi pro manipulaci
se soubory máte plnou kontrolu nad tím, kdo smí uploadovat a co se má
udělat s uploadovaným souborem.
Nezapomeňte, že PHP podporuje také uploady metodou PUT tak, jak se používá
v Netscape Composeru a v editoru Amaya od W3C. Pro bližší detaily viz
Podpora metody PUT.
Obrazovka pro upload souboru může být tvořena speciálním formulářem, který
vypadá podobně jako tento:
Příklad 18-1. Formulář pro upload souboru <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> |
|
_URL_ by mělo označovat PHP soubor. Skryté pole MAX_FILE_SIZE musí
předcházet pole pro vložení souboru a jeho hodnota specifikuje maximální
akceptovanou velikost souboru. Hodnota je v bytech.
| Varování |
Hodnota MAX_FILE_SIZE je z hlediska prohlížeče pouze informativní.
Je snadné ji obejít. Takže nepočítejte s tím, že prohlížeč se bude
chovat tak, jak si přejete. Nastavení maximální velikosti v PHP však
samozřejmě nemůže být obelstěno.
|
Proměnné definované pro uploadované soubory se liší v závislosti na
verzi a konfiguraci PHP. Pokud je aktivní volba
track_vars, bude inicializováno pole
$HTTP_POST_FILES/$_FILES. Konečně, související proměnné mohou být
inicializovány jako globální, pokud je zapnuta volba
register_globals.
Ovšem používání globálních proměnných není doporučeno.
Po úspěšném uploadu budou v cílovém skriptu definovány následující
proměnné:
Poznámka:
track_vars je od PHP 4.0.3
vždy zapnuto. U PHP 4.1.0 a pozdějších může být použito $_FILES
namísto $HTTP_POST_FILES. $_FILES
je vždy globální proměnná, takže by se neměla používat specifikace
global pro proměnnou $_FILES.
$HTTP_POST_FILES/$_FILES
obsahuje informace o uploadovaném souboru.
Obsah $HTTP_POST_FILES je takovýto (uvědomte si, že
se předpokládá použití názvu uploadovaného souboru 'userfile' tak,
jako v příkladu výše):
- $HTTP_POST_FILES['userfile']['name']
Originální název souboru na klientském počítači.
- $HTTP_POST_FILES['userfile']['type']
MIME typ souboru, pokud prohlížeč tuto informaci poskytuje
(např. "image/gif").
- $HTTP_POST_FILES['userfile']['size']
Velikost uploadovaného souboru v bytech.
- $HTTP_POST_FILES['userfile']['tmp_name']
Dočasný název souboru, pod nímž byl uploadovaný soubor uložen na server.
Poznámka:
PHP 4.1.0 a pozdější podporují zkrácený název proměnné
$_FILES. PHP 3 nepodporuje
$HTTP_POST_FILES.
Obsah proměnnách v situaci, kdy je proměnná
register_globals
zapnuta nastavením v souboru php.ini (uvědomte si, že
se předpokládá použití názvu uploadovaného souboru 'userfile' tak,
jako v příkladu výše):
$userfile - Dočasný název souboru, pod kterým byl
uploadovaný soubor uložen na server.
$userfile_name - Originální název souboru nebo cesta
na odesílajícím systému.
$userfile_size - Velikost uploadovaného souboru
v bytech.
$userfile_type - MIME typ souboru, pokud prohlížeč
tuto informaci poskytuje (např. "image/gif").
Uvědomte si, že proměnná "
$userfile" ve skutečnosti
představuje název pole <input> se specifikací type="file" ve
formuláři. Pro výše uvedený příklad jsme zvolili název "userfile".
Poznámka:
Nastavení register_globals = On se nedoporučuje z
bezpečnostních a výkonnostních důvodů.
Soubory se implicitně ukládají do systémového adresáře pro dočasné
soubory, pokud nebylo direktivou
upload_tmp_dir v souboru
php.ini stanoveno jinak. Systémový adresář pro
dočasné soubory může být změněn nastavení proměnné prostředí
TMPDIR v prostředí, kde PHP běží. Nastavení za použití
putenv() z PHP skriptu nebude fungovat. Tato
proměnná prostředí může být také použita k ujištění se, že všechny
ostatní operace pracují s uploadovanými soubory.
Příklad 18-2. Ověřování uploadu souboru
Následující příklady jsou pro verze PHP 4 vyšší než PHP 4.0.2.
(viz funkce
is_uploaded_file() a
move_uploaded_file()).
<?php
// V PHP 4.1.0 a pozdějších by mělo být použito $_FILES namísto $HTTP_POST_FILES.
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'];
}
/* ...or... */
move_uploaded_file($HTTP_POST_FILES['userfile']['tmp_name'], "/place/to/put/uploaded/file");
?> |
|
PHP skript, který přijímá uploadované soubory, by měl implementovat
veškerou logiku pro stanovení, co by se mělo udělat s uploadovaným
souborem. Můžete např. použít proměnnou
$HTTP_POST_FILES['userfile']['size'] pro zahození
souborů, které jsou příliš malé nebo velké. Mohli byste použít také
proměnnou $HTTP_POST_FILES['userfile']['type']
pro filtraci souborů podle MIME datového typu. Bez ohledu na řešení,
soubor by měl být smazán nebo přesunut jinam.
Soubor bude automaticky smazán z dočasného adresáře na konci skriptu,
pokud nebyl přesunut jinam nebo přejmenován.