COMPUTERWORLD
 

profil kontakt CD-ROM CW100 p°edplatnΘ

archiv anketa CO VY NA TO? CW kariΘra serißly
 

IDG

IDG CZ homepage
COMPUTERWORLD
PC WORLD
INTERNET4U
MEGABYTE
TESTCENTRUM
ON-LINE






COMPUTERWORLD 28/98

Formulß°e pot°etφ

Ji°φ Kosek ml.

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 vytvo°it tlaΦφtko s obrßzkem a jak se dajφ pomocφ formulß°∙ posφlat soubory na server ke zpracovßnφ.

TlaΦφtko s obrßzkem

Zatφm umφme formulß° odeslat na server pouze pomocφ tlaΦφtka SUBMIT. Existuje vÜak jeÜt∞ jedna mo₧nost. K odeslßnφ m∙₧e slou₧it i obrßzek. Pokud na n∞j u₧ivatel klikne, odeÜle se serveru obsah formulß°e spoleΦn∞ se sou°adnicemi kliknutφ.

Obrßzek, kter² slou₧φ k odeslßnφ formulß°e, se vklßdß op∞t pomocφ elementu INPUT. Jako hodnotu atributu TYPE vÜak musφme pou₧φt IMAGE. Adresa obrßzku se zadßvß pomocφ atributu SRC. Podobn∞ jako u obrßzk∙ m∙₧eme pou₧φt atributy ALT pro popis obrßzku a ALIGN pro urΦenφ zarovnßnφ obrßzku s okolnφm textem.

<FORM ACTION="skript" METHOD=GET>
<TABLE BORDER=0>
<TR VALIGN=TOP>
<TD>
Vyberte si ukazatel:
<BLOCKQUOTE>
<INPUT TYPE=RADIO NAME=Ukazatel
VALUE=Natalita CHECKED>Natalita<BR>
<INPUT TYPE=RADIO NAME=Ukazatel
VALUE=Mortalita>Mortalita<BR>
<INPUT TYPE=RADIO NAME=Ukazatel
VALUE=Rozvodovost>Rozvodovost<BR>
<INPUT TYPE=RADIO NAME=Ukazatel
VALUE=Obyvatelstvo>PoΦet obyvatel<BR>
<INPUT TYPE=RADIO NAME=Ukazatel
VALUE=Vek>Pr∙m∞rn² v∞k obyvatel<BR>
</BLOCKQUOTE>
</TD>
<TD>
Vyberte si stßt:<BR>
<INPUT TYPE=IMAGE NAME=Mapa SRC="au-mapa.gif"
ALT="Mapa Austrßlie">
</TD>
</TR>
</TABLE>
</FORM>

V PHP budou sou°adnice kliknutφ myÜφ na obrßzek p°φstupnΘ v prom∞nn²ch $Mapa_x a $Mapa_y. Prefix p°ed jmΘnem sou°adnice odpovφdß jmΘnu vstupnφho prvku urΦenΘmu pomocφ atributu NAME. V ASP budou sou°adnice kliknutφ dostupnΘ pomocφ Request.QueryString("Mapa.x") a Request.QueryString("Mapa.y").

AΦ to tak ani nevypadß, nem∞li bychom tlaΦφtko IMAGE p°φliÜ pou₧φvat. Jednak je takov² formulß° nepou₧iteln² v textov²ch prohlφ₧eΦφch jako je Lynx a jednak je zpracovßnφ informacφ o sou°adnicφch kliknutφ v skriptu pom∞rn∞ komplikovanΘ.

Upload soubor∙

N∞kdy v naÜich aplikacφch pot°ebujeme, aby u₧ivatel mohl na server odeslat soubor. Praktick²ch p°φklad∙ je mnoho -- u₧ivatel poÜle svoji fotografii jako obrßzek, kter² se bude zobrazovat u jeho p°φsp∞vk∙ ve virtußlnφ diskusnφ sφni; autor HTML strßnek odeÜle vytvo°enou strßnku ke kontrole syntaktickΘ sprßvnosti na server, kter² tuto slu₧bu nabφzφ; redaktor webzinu odeÜle pomocφ formulß°e na webovΘ strßnce aktußlnφ p°φsp∞vek.

Na tyto pot°eby jazyk 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, mß nßsledujφcφ podobu:

<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 4 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φ si 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 skonΦφ.

Pokud soubor existuje, m∙₧eme s nφm d∞lat celou °adu v∞cφ. V PHP mßme k dispozici n∞kolik funkcφ pro prßci se souborem jako s celkem (p°esouvßnφ, kopφrovßnφ, mazßnφ soubor∙ apod.) i 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 2 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 1 024 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ß na rozdφ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 o n∞co 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 takΘ, jak vytvß°et formulß°e, se kter²mi se bude u₧ivatel∙m pohodln∞ pracovat.

 

 

© IDG Czechoslovakia, a.s., VÜechna prßva vyhrazena
info@idg.cz, webmaster@idg.cz