Manuál PHP | ||
---|---|---|
Předcházející | Další |
Kapitola 38. Zpracování uploadu souborů
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:
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").
$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 38-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 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.
Předcházející | Domů | Další |
Dealing with XForms | Nahoru |