Formulß°e III.

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 se dajφ pomocφ formulß°∙ posφlat soubory na server ke zpracovßnφ.

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 webovskΘ strßnce aktußlnφ p°φsp∞vek.

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

Obr. 1: Vypln∞n² formulß° pro odeslßnφ souboru
Formulß° pro odeslßnφ souboru

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(" ", "&nbsp;", 
             htmlspecialchars(fgets($fp, 1024)));
        echo "<BR>";
      endwhile;  

    else:                   // typ zobrazenφ PLAIN

      while (!feof($fp)):
        echo ereg_replace(" ", "&nbsp;", 
             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 '&lt;', '&gt;' a '&amp;'. 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 (&nbsp;). 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.

Obr. 2: V²sledek skriptu pro zobrazovßnφ HTML strßnek
Skript pro zobrazovßnφ HTML strßnek

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.

Obr. 3: Druh² formßt v²stupu skriptu
Skript pro zobrazovßnφ HTML strßnek


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.

© Ji°φ Kosek 1999