Autor: Marek Pawłowski
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&amp;amp;amp;amp;amp;amp;lt;/blockquote&amp;amp;amp;amp;amp;amp;gt;
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[&amp;amp;amp;amp;amp;amp;quot;myfile&amp;amp;amp;amp;amp;amp;quot;]["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
Administratorem Twoich danych osobowych będzie Rafał Płatek, prowadzący działalność gospodarczą pod firmą CREAM.SOFTWARE RAFAŁ PŁATEK, wpisaną do rejestru ewidencji gospodarczej CEiDG pod numerem NIP 681-112-89-55. Szczegóły związane z przetwarzaniem danych osobowych znajdziesz w polityce prywatności.