Czasem zachodzi potrzeba przesłania pliku na serwer z poziomu formularza dostępnego na stronie WWW. W tym artykule zaprezentuję jak tego dokonać z wykorzystaniem języka PHP i Pajączka.

Najpierw utworzymy prosty formularz, za pomocą którego użytkownicy będą mogli wysłać plik na nasz serwer.

<form enctype="multipart/form-data" action="<?= $PHP_SELF 
?>" method="post">'; 
   <input type="file" name="myfile"> 
   <input type="submit" value="submit"> 
   <input type="hidden" name="MAX_FILE_SIZE" 
value="10000"> 
</form> 

Kilka spraw wymaga tutaj wytłumaczenia. Po pierwsze atrybut enctype zamiast domyślnej wartości „application/x-www-form-urlencoded” przybiera postać „multipart/form-data”. To poinformuje serwer, że nasz formularz prócz danych tekstowych wysyła także pliki. Kolejna sprawa to atrybut action – tu pojawia się fragment kodu PHP. Konstrukcja jest równoznaczna , a więc wartość atrybutu będzie wskazywać na sam dokument zawierający formularz. Oczywiście upload może być obsługiwany przez inny skrypt, ale tak jest po prostu wygodnie, jako że mamy zebrane wszystko w jednym pliku. Ukryte pole o nazwie MAX_FILE_SIZE informuje przeglądarkę, że nie życzymy sobie przyjmować plików o rozmiarze większym niż podany (wartość w bajtach). Niestety jest to zabezpieczenie, które dość łatwo ominąć. Na szczęście wartości upload_max_filesize w pliku php.ini nie da się oszukać. Uwaga, jednak, ta zmienna ma domyślną wartość 2 megabajtów. Możemy ją jednak zmienić z poziomu skryptu za pomocą funkcji ini_set().

OK. Mamy już formularz, czas zabrać się za pisanie skryptu. Jednak zanim to zrobimy musimy się dowiedzieć w jaki sposób PHP obsługuje upload plików. Jeśli tak jak w moim przykładzie pole file miało nazwę myfile to w obrębie skryptu PHP dostępne będą następujące zmienne:

$myfile - tymczasowa nazwa pliku 
$myfile_name - oryginalna nazwa pliku 
$myfile_size - wielkość pliku 
$myfile_type - typ MIME pliku</blockquote>

Nas będą interesowały tylko te dwie pierwsze. Po wysłaniu formularza plik zostanie zapisany w katalogu podanym w upload_tmp_dir w php.ini pod tymczasową nazwą. Do nas należy tylko sprawdzenie, czy plik został faktycznie wysłany z naszej strony i skopiowanie go pod podaną nazwą do miejsca gdzie chcemy go umieścić. Do sprawdzenia czy ktoś nie próbuje przesłać nielegalnie pliku na nasz serwer możemy użyć funkcji is_uploaded_file() lub move_uploaded_file(), które są dostępne od wersji PHP 3.0.17 i PHP 4.0.3. Cały skrypt powinien wyglądać mniej więcej tak:

<?php 
if (!isSet($myfile)) { 
?> 
<form enctype="multipart/form-data" action="<?= $PHP_SELF 
?>" method="post">'; 
   <input type="file" name="myfile"> 
   <input type="submit" value="submit"> 
   <input type="hidden" name="MAX_FILE_SIZE" 
value="10000"> 
</form> 
<?php 
} elseif (is_uploaded_file($myfile)) { 
   copy($myfile, $myfile_name); 
   echo "Udany upload pliku!"; 
} else 
   die('Próba ataku! Plik: ' . $myfile); 
?> 

Jeśli zmienna $myfile nie istnieje wyświetlamy formularz. W przeciwnym przypadku sprawdzamy czy plik został legalnie wysłany na nasz serwer. Jeżeli tak – kopiujemy go w wybrane przez nasz miejsce, jeśli nie – wypisujemy ostrzeżenie. To jest cała filozofia…

W PHP 4 prócz wyżej wymienionych zmiennych tworzona jest także tablica $HTTP_POST_FILES (od PHP 4.1.0 można użyć tablicy $_FILES) następującej postaci:

$_FILES["myfile"]["tmp_name"] - tymczasowa nazwa pliku 
$_FILES["myfile"]["name"] - oryginalna nazwa pliku 
$_FILES["myfile"]["size"] - wielkość pliku 
$_FILES["myfile"]["type"] - typ MIME pliku

To już właściwie wszystko. Gdyby ktoś miał jakieś wątpliwości zachęcam do przeglądnięcia podręcznika PHP:

Upload plików
is_uploaded_file()
move_uploaded_file()
copy()

Pozdrawiam,
Marek LOCKOOM Pawłowski

Skasowane dane to nie zawsze tragedia - ściągnij program i odzyskaj dane