Dnes budeme pokraΦovat v naÜem p°ehledu zßkladnφch prvk∙ pou₧iteln²ch p°i tvorb∞ formulß°∙. Podφvßme se na to, jak se dajφ pomocφ formulß°∙ posφlat soubory na server ke zpracovßnφ.
Na tyto pot°eby HTML pamatuje, a tak u elementu INPUT
m∙₧eme pou₧φt atribut TYPE=FILE
. Takto vytvo°enΘ vstupnφ
pole umo₧nφ zadat jmΘno souboru. P°i odesφlßnφ formulß°e je pak cel²
takto zadan² soubor odeslßn s ostatnφmi daty z formulß°e. Velikost
vstupnφho pole a maximßlnφ dΘlku jmΘna souboru m∙₧eme ovliv≥ovat pomocφ
atribut∙ SIZE
a MAXLENGTH
stejn∞ jako u
textov²ch vstupnφch polφ (TYPE=TEXT
).
N∞kterΘ prohlφ₧eΦe umo₧≥ujφ u vstupnφho pole pro zadßnφ jmΘna souboru
pou₧itφ atributu ACCEPT
. Jako jeho hodnota se uvßdφ Φßrkami
odd∞len² seznam MIME typ∙ soubor∙, kterΘ je mo₧no zadat. Tak nap°φklad
pou₧itφ ACCEPT="image/*"
prohlφ₧eΦi °φkß, ₧e u₧ivatel m∙₧e
poslat jak²koliv obrßzek.
My si upload soubor∙ ukß₧eme na jednoduchΘ aplikaci, kterß bude slou₧it k prohlφ₧enφ HTML soubor∙. U₧ivatel bude moci zvolit jmΘno souboru a typ zobrazenφ. Skript pak podle jeho po₧adavk∙ strßnku zobrazφ bu∩ ve zdrojovΘm tvaru vΦetn∞ vÜech HTML tag∙ nebo zobrazφ pouze samotn² nezformßtovan² text strßnky. Formulß° pro urΦenφ jmΘna souboru, kter² se bude odesφlat na server:
<HTML> <HEAD> <TITLE>ZobrazovaΦ HTML strßnek</TITLE> </HEAD> <BODY> <H1>ZobrazovaΦ HTML strßnek</H1> <FORM ACTION=10-01.php3 METHOD=POST ENCTYPE="multipart/form-data"> <TABLE BORDER=0> <TR> <TD>JmΘno souboru: <TD><INPUT TYPE=FILE NAME=Soubor> <TR VALIGN=TOP> <TD>Typ zobrazenφ: <TD><INPUT TYPE=RADIO NAME=Typ VALUE=HTML CHECKED> HTML<BR> <INPUT TYPE=RADIO NAME=Typ VALUE=PLAIN> Pouze text <TR> <TD><INPUT TYPE=SUBMIT VALUE=" OK "> </TABLE> </FORM> </BODY> </HTML>U formulß°e, kter² mß odesφlat soubor na server, musφme pou₧φt atribut
ENCTYPE
, kter² urΦuje metodu pou₧itou p°i k≤dovßnφ dat
formulß°e. Standardn∞ pou₧φvanß metoda pro p°enos dat z formulß°e mß
oznaΦenφ application/x-www-form-urlencoded
. P°i odesφlßnφ
soubor∙ vÜak musφme pou₧φt metodu k≤dovßnφ
multipart/form-data
.
Pokud odesφlßme soubory, m∙₧eme pou₧φvat pouze metodu
POST
-- metoda GET
je pro tyto ·Φely zcela
nevhodnß.
Skript PHP, kter² zpracovßvß formulß°e slou₧φcφ k odeslßnφ souboru,
obdr₧φ o ka₧dΘm odeslanΘm souboru informace ve Φty°ech prom∞nn²ch. JmΘna
t∞chto prom∞nn²ch zaΦφnajφ stejn∞ jako jmΘno formulß°ovΘho pole pro
zadßnφ jmΘna souboru. V naÜem p°φpad∞ tedy p∙jde o prom∞nnΘ zaΦφnajφcφ
na $Soubor...
.
Po p°enesenφ souboru na server jej PHP ulo₧φ pod doΦasn²m jmΘnem do
doΦasnΘho adresß°e. JmΘno, pod kter²m je p°enesen² soubor ulo₧en, v
naÜem p°φpad∞ obsahuje prom∞nnß $Soubor
. Prom∞nnß
$Soubor_size
obsahuje velikost p°enesenΘho souboru v
bajtech. Typ p°enesenΘho souboru je ulo₧en v prom∞nnΘ
$Soubor_type
. P∙vodnφ jmΘno odesφlanΘho souboru zφskßme v
prom∞nnΘ $Soubor_name
.
Nynφ se tedy m∙₧eme ukßzat zdrojov² k≤d obslu₧nΘho skriptu
(10-01.php3
), kter² si dßle jeÜt∞ podrobn∞ji vysv∞tlφme:
<HTML> <HEAD> <TITLE>Soubor: <?echo $Soubor_name?></TITLE> </HEAD> <BODY> <H1>Soubor <?echo $Soubor_name?></H1> DΘlka: <?echo $Soubor_size?><BR> Typ: <?echo $Soubor_type?> <PRE> <? if (file_exists($Soubor)):// p°enesl se soubor ? $fp = fopen($Soubor, "r"); // otev°enφ souboru if ($Typ=="HTML"): // typ zobrazenφ HTML while (!feof($fp)): echo ereg_replace(" ", " ", htmlspecialchars(fgets($fp, 1024))); echo "<BR>"; endwhile; else: // typ zobrazenφ PLAIN while (!feof($fp)): echo ereg_replace(" ", " ", fgetss($fp, 1024)); echo "<BR>"; endwhile; endif; fclose($fp); // zav°enφ souboru unlink($Soubor); // smazßnφ souboru else: // soubor se nep°enesl echo "DoÜlo k chyb∞ p°i p°enosu souboru!"; endif; ?> </PRE> </BODY> </HTML>Skript do nßzvu strßnky a do nadpisu vyplnφ jmΘno zobrazovanΘ strßnky. PotΘ skript pomocφ funkce
file_exists()
zjistφ, zda
existuje soubor, ve kterΘm je p°enßÜen² soubor doΦasn∞ ulo₧en. Pokud
soubor neexistuje, vypφÜe se chybovΘ hlßÜenφ a skript konΦφ.
Pokud soubor existuje, m∙₧eme s nφm d∞lat spoustu v∞cφ. V PHP mßme k dispozici n∞kolik funkcφ pro prßci se soubory jako s celkem (p°esouvßnφ, kopφrovßnφ, mazßnφ soubor∙ apod.) nebo pro p°φstup k samotnΘmu obsahu souboru.
Pokud chceme Φφst obsah souboru, musφme si soubor nejprve otev°φt pro
Φtenφ. K tomu slou₧φ funkce fopen()
. Prvnφm parametrem je
jmΘno souboru a druh²m zp∙sob p°φstupu k souboru -- r
znaΦφ
p°φstup pro Φtenφ. Funkce fopen()
vracφ hodnotu, kterß pak
otev°en² soubor identifikuje v ostatnφch funkcφch pro prßci se soubory.
Nßsledn∞ se skript d∞lφ na dv∞ v∞tve, podle po₧adovanΘho formßtu zobrazenφ strßnky. Prvnφ v∞tev zobrazuje strßnku vΦetn∞ HTML tag∙, druhß pouze samotn² text strßnky.
Pokud chceme n∞jak²m zp∙sobem zpracovat cel² soubor, musφme jej Φφst
tak dlouho, dokud nenarazφme na jeho konec. K testovßnφ zda jsme na
konci souboru slou₧φ funkce feof()
. Ta vracφ hodnotu
true
, pokud jsme ji₧ na konci specifikovanΘho souboru.
Cyklus while(!feof($fp))
nßm tedy umo₧nφ zpracovat cel²
soubor. (Vyk°iΦnφk v podmφnce znamenß negaci -- cyklus se bude provßd∞t
tak dlouho, dokud nebude dosa₧en konec souboru.)
NaÜi anal²zu si nynφ zaslou₧φ nßsledujφcφ Φßst skriptu:
echo ereg_replace(" ", "& ", htmlspecialchars(fgets($fp, 1024)));Funkce
fgets($fp, 1024)
Φte ze souboru $fp
jednu °ßdku, nejv²Üe vÜak 1024 znak∙. V²sledkem funkce je znakov²
°et∞zec. Tento °et∞zec vstupuje jako parametr do funkce
htmlspecialchars()
. Tato funkce nahradφ vÜechny v²skyty
znak∙ '<
', '>
' a '&
'
odpovφdajφcφmi znakov²mi entitami '<
',
'>
' a '&
'. Tφm docφlφme toho,
₧e znakov² °et∞zec ji₧ neobsahuje ₧ßdnΘ HTML tagy, kterΘ by se sna₧il
prohlφ₧eΦ interpretovat.
Nakonec v zφskanΘm °et∞zci nahradφme vÜechny mezery pevnou mezerou
(
). Z∙stane tedy zachovßno odsazenφ jednotliv²ch
°ßdek HTML k≤du. K nahrazenφ mezer jsme pou₧ili funkci
ereg_replace()
. Prvnφ parametr je °et∞zec, kter² se bude
nahrazovat, druh² parametr je °et∞zec, kter²m se budou nahrazovat
vÜechny v²skyty prvnφho °et∞zce v °et∞zci zadanΘm jako poslednφ
parametr.
V²sledkem naÜeho sna₧enφ je °ßdka, kde jsou vÜechny specißlnφ HTML
znaky a mezery nahrazeny p°φsluÜn²mi entitami. Takto zφskan² °et∞zec
vypφÜeme pomocφ p°φkazu echo
. Nßsledn∞ pomocφ p°φkazu
echo "<BR>"
ukonΦφme prßv∞ vypsanou °ßdku.
Pokud chceme vypsat pouze text strßnky bez HTML tag∙, postupujeme
obdobn∞. Nynφ vÜak pou₧φvßme funkci fgetss()
, kterß
narozdφl od fgets()
ze svΘho v²sledku vynechßvß vÜechny
HTML tagy. V²sledkem je tedy v²pis strßnky oproÜt∞nΘ od HTML tag∙.
Nakonec uzav°eme otev°en² soubor pomocφ fclose()
a
sma₧eme doΦasn² soubor pomocφ funkce unlink()
. Pokud bychom
soubor nesmazali, zbyteΦn∞ by se nßm zaslanΘ soubory hromadily v
adresß°i pro doΦasnΘ soubory.
Pokud pou₧φvßme ASP a chceme zpracovßvat odeslanΘ soubory, mßme situaci troÜku slo₧it∞jÜφ. ASP toti₧ neobsahujφ p°φmo podporu pro upload soubor∙. S n∞kter²mi verzemi IIS se vÜak dodßvß aplikace Posting Acceptor, kterß umo₧≥uje snadnou prßci se soubory zaslan²mi na server.
P°φÜt∞ se podφvßme na zb²vajφcφ prvky formulß°∙ -- seznamy a vφce°ßdkov² text. Ukß₧eme si, jak vytvß°et formulß°e, se kter²mi se bude u₧ivatel∙m pohodln∞ pracovat.