Kapitola 19. Zpracovßnφ uploadu soubor∙

Obsah
Uploading metodou POST
╚astß ·skalφ
Uploading vφce soubor∙
Podpora metody PUT

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 19-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):

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 19-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.