Rozdzia│ 18. Obs│uga wysy│ania plik≤w na serwer.
Wysy│anie metod▒ POST
PHP potrafi odbieraµ pliki wys│ane przez przegl▒darki obs│uguj▒ce RFC-1867 (Netscape Navigator 3 i nowsze, Microsoft Internet Explorer 3 z patchem, i nowsze). Ta cecha pozwala wysy│aµ zar≤wno pliki binarne jak i tekstowe. Wraz z autentykacj▒ PHP i funkcjami manipuluj▒cymi plikami, masz pe│n▒ kontrolΩ nad tym kto mo┐e wysy│aµ pliki i co ma byµ zrobione z tymi plikami.
PamiΩtaj tak┐e, ┐e PHP umo┐liwia wysy│anie plik≤w metod▒ PUT u┐ywan▒ przez Netscape Composer i kient≤w W3C's Amaya. Zobacz Wsparcie dla metody PUT.
Wys│anie pliku mo┐e byµ zrealizowane poprzez specjalny formularz na stronie www:
Przyk│ad 18-1. Formularz wysy│aj▒cy plik
<FORM ENCTYPE="multipart/form-data" ACTION="_URL_" METHOD=POST>
<INPUT TYPE="hidden" name="MAX_FILE_SIZE" value="1000">
Wyslij ten plik: <INPUT NAME="userfile" TYPE="file">
<INPUT TYPE="submit" VALUE="Wy╢lij plik">
</FORM>
|
úa±cuch _URL_ powinien wskazywaµ skrypt PHP obs│uguj▒cy nadchodz▒ce pliki. Ukryte pole MAX_FILE_SIZE musi poprzedzaµ pole z nazw▒ pliku, a jego warto╢µ okre╢la maksymalny rozmiar w bajtach tego pliku. W tym docelowym pliku ( _URL_ ) po pomy╢lnym przes│aniu bΩd▒ zdefiniowane nastΩpuj▒ce zmienne:
- $userfile - tymczasowa nazwa pliku (wys│anego przez przegl▒darkΩ) zapisanego na serwerze (po przes│aniu).
- $userfile_name - oryginalna nazwa przes│anego pliku
- $userfile_size - wielko╢µ przes│anego pliku w bajtach
- $userfile_type - typ mime przes│anego pliku je┐eli przegl▒darka dostarcza takiej informacji, np. "image/gif".
Zmienna "$userfile" bΩdzie zawieraµ nazwΩ pliku umieszczon▒ w formularzu przy polu TYPE=file (w tym przypadku "userfile")
Pliki domy╢lnie s▒ zapisywane w katalogu tymczasowym serwera. Katalog ten mo┐na zmieniµ ustawiaj▒c zmienn▒ TMPDIR. Niestety, brak jest mo┐liwo╢ci zdefiniowania tej zmiennej ╢rodowiskowej ze skryptu PHP przy pomocy funkcji putenv().
Skrypt PHP kt≤ry odbierze nadchodz▒cy plik powinien wykonaµ konieczne okre╢lone czynno╢ci na tym pliku. Mo┐na na przyk│ad u┐ywaj▒c zmiennej $file_size przepuszczaµ do dalszej obr≤bki pliki kt≤re maja okre╢lon▒ wielko╢µ. U┐ywaj▒c zmiennej $file_type mo┐esz przepuszczaµ pliki kt≤re spe│niaj▒ okre╢lone kryteria. Oczywi╢cie pliki nale┐y usuwaµ lub przenosiµ w inne miejsce po ich wykorzystaniu.
Plik zostanie usuniΩty z katalogu tymczasowego po zamkniΩciu po│▒czenia, w przypadku gdy nie zosta│ przeniesiony lub nie zmieniono jego nazwy.
NajczΩstsze pu│apki
MAX_FILE_SIZE nie mo┐e definiowaµ wielko╢ci pliku wiΩkszej ni┐ wielko╢µ okre╢lona przez upload_max_filesize w php.ini lub dyrektywa Apache php_upload_max_filesize. Domy╢lnie 2 MB.
Wysy│anie wielu plik≤w
Mo┐liwe jest odbieranie przez serwer wielu plik≤w r≤wnocze╢nie i umieszczanie informacji w nich zawartych w tablicy. Aby to zrobiµ nale┐y u┐yµ tej samej tablicy w sk│adni formularza HTML :
Przyk│ad 18-2. Formularz wysy│aj▒cy wiele plik≤w
<form action="file-upload.html" method="post"
enctype="multipart/form-data">
Wy╢lij nastΩpuj▒ce pliki:<br>
<input name="userfile[]" type="file"><br>
<input name="userfile[]" type="file"><br>
<input type="submit" value="Wy╢lij pliki">
</form>
|
Kiedy powy┐szy formularz zostanie wys│any, tablice $userfile, $userfile_name oraz $userfile_size bΩd▒ dostΩpne globalnie (jak r≤wnie┐ w $HTTP_POST_VARS). Ka┐da z nich bΩdzie tablic▒ indeksowan▒ numerycznie, kt≤rej warto╢ci to wys│ane pliki.
Dla przyk│adu, /home/test/review.html i /home/test/xwp.out to wy╢│ane plik. W tym przypadku $userfile_name[0] bΩdzie zawieraµ warto╢µ review.html, a $userfile_name[1] bΩdzie zawieraµ warto╢µ xwp.out. Podobnie, $userfile_size[0] bΩdzie zawieraµ wielko╢µ pliku review.html's , itd.
Wsparcie dla metody PUT
PHP pozwala na u┐ywanie metody HTTP PUT stosowanej przez Netscape Composer i W3C Amaya. »▒dania PUT s▒ o wiele prostsze ni┐ wysy│anie plik≤w i wygl▒daja jak:
PUT /katalog/nazwa_pliku.html HTTP/1.1
Powy┐sza linia oznacza, ┐e zdalny klient mo┐e zapisaµ zawarto╢µ pliku: /katalog/nazwa_pliku.html na dysku serwera. Oczywi╢cie nie jest to dobry pomys│ aby ka┐dy m≤g│ zapisywaµ pliki na dysku serwera. Nale┐y okre╢liµ kt≤re skrypty mog▒ siΩ pos│ugiwaµ t▒ metod▒. W Apache'u nale┐y u┐yµ w tym celu dyrektywy Script w pliku konfiguracyjnym, zwylke umieszczonej wewn▒trz bloku <Directory> b▒d╝ <Virtualhost> Linia zezwalaj▒ca na u┐ycie metody PUT przez skrypt put.php wygl▒da nastΩpuj▒co: Script PUT /put.php
Od tej chwili wszelkie ┐▒dania z metod▒ PUT skierowane do <Directory> czy <Virtualhost> bΩd▒ trafia│y do skryptu put.php. Oczywi╢cie dla tego katalogu/virtualhosta musi byµ aktywny PHP obs│uguj▒cy skrypty z rozszerzeniem .php.
Wewn▒trz skryptu put.php powiniene╢ umie╢ciµ:
<? copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI);
?>
Plik zostanie skopiowany do lokalizacji ┐▒danej przez zdalnego klienta. Prawdopodobnie chcia│by╢ dokonaµ sprawdzenia autentyczno╢ci u┐ytkownika zanim wykonasz to kopiowanie. Zwr≤µ uwagΩ, ┐e kiedy PHP otrzyma ┐▒danie z metod▒ PUT, zapisuje otrzymany plik w pliku tymczasowym. Kiedy ┐▒danie jest zako±czone, plik tymczasowy jest kasowany. Skrypt PHP dla metody PUT mo┐e skopiowaµ plik w dowolne miejsce. Nazwa pliku tymczasowego przechowywana jest przez zmienn▒ $PHP_PUT_FILENAME, za╢ sugerowana nazwa tego pliku przez $REQUEST_URI. Nazwa jest taka jak okre╢li│ zdalny klient. Oczywi╢cie mo┐esz j▒ zmieniµ, np. kopiowaµ wszystkie przychodz▒ce pliki do specjalnego katalogu "upload".
|