Přenos souboru z počítace uživatele na server
Přenos souboru z klienta na server řeší RFC1867.
HTML formuláře pro odeslání souboru
RFC1867 přináší tři změny při tvorbě formuláře na HTML stránce.
- Přidává volbu atributu TYPE=FILE příkazu INPUT
- Povoluje atribut ACCEPT pro příkaz INPUT. Atribut ACCEPT definuje seznamem MIME typů oddelených čárkou, které jsou povoleny na vstupu (viz specifikace MIME)
- Definuje nový MIME typ - multipart/form-data a definuje chování klienta při interpretaci formuláře, který obsahuje ENCTYPE="multipart/form-data" a/nebo <INPUT TYPE=file>. (ENCTYPE=aplication/x-www-form-urlencoded, který je implicitně používaný pro přenos dat zadaných do formuláře, není vhodný pro soubory s binárními daty)
Příklad zdrojového tvaru formuláře:
<FORM ENCTYPE="multipart/form-data" ACTION="/cgi-bin/prenos.pl" METHOD=POST>
Vaše jméno: <INPUT NAME=jm SIZE=40><BR>
Jméno přenášeného souboru:
<INPUT NAME=jmeno1 TYPE=FILE SIZE=40><BR>
Datum: <INPUT NAME=dat SIZE=10><P>
<INPUT TYPE=SUBMIT VALUE="Odeslani souboru">
<INPUT TYPE=RESET VALUE="Zacit znovu">
</FORM>
|
Interpretace formuláře klientským programem:
Atributy ve spojení s TYPE=FILE
- VALUE - implicitní jméno souboru
- SIZE=(WIDTH,HEIGTH) - počet znaků, počet řádek pokud se očekává zadání více souborů - v současné době není podporováno
Zpětná kompatibilita
- ENCTYPE se ignoruje
- INPUT TYPE=FILE zobrazí prohlížeč jako textové okno, do kterého uživatel zadá jméno souboru.
- jméno souboru se odešle standardním kódováním
- CGI script musí být napsaný tak, aby ošetřil situaci, kdy browser nemá implementovaný file upload (data dojdou na server v kódování aplication/x-www-form-urlencoded místo multipart/form-data)
Starší prohlížeče mohou k přenosu souboru použít helper aplikaci. CGI script od staršího prohlížeče obdrží v kódování aplication/x-www-form-urlencoded jméno souboru na místo jeho obsahu. Jako odpověď může CGI script poslat řetězec, který bude zpracován na straně klienta helper aplikací. Může to být datový řetězec typu application/x-please-send-files, který obsahuje:
- URL, kam mají být poslána data
- Seznam jmen souborů
- Data z původního formuláře
Prohlížeč musí být nakonfigurován tak, aby po obdržení odpovědi typu application/x-please-send-files spustil helper aplikaci. Helper aplikace by měla generovat data ve tvaru, který se očekává od nových verzí prohlížečů, viz. dále. Na straně serveru pak stačí ke zpracování požadavků od starších i novějších prohlížečů jeden CGI script.
Použití kódování multipart/form-data
Pole formuláře jsou poslána v pořadí, ve kterém jsou uvedena ve formuláři.
Pole jsou oddělena hraniční čarou "boundary". Každá část je identifikována jménem z atributu INPUT ve formuláři. Každá část může být uvozena odpovídajícím content-type, pokud je známý nebo application/octet-stream.
Pokud je vybráno více souborů budou přenášeny použitím formátu multipart/mixed.
Jméno původního souboru je předáno v parametru filename nebo v hlavičče content-disposition: form-data.
CGI program specifikovaný v atributu ACTION musí očekávat data v kódování multipart/form-data.
Příklad:
Při použití předchozího formuláře obdrží server data od klienta ve tvaru:
-----------------------------24125315913874
Content-Disposition: form-data; name="jm"
Jan Novak
-----------------------------24125315913874
Content-Disposition: form-data; name="jmeno1";filename="C:\ZIP\Prac\s1.txt"
Content-Type: text/plain
Zacatek prvniho souboru
.
.
.
konec prvniho souboru
-----------------------------24125315913874
Content-Disposition: form-data; name="dat"
20/8/1996
-----------------------------24125315913874--