Blog
Upload plików na serwer w PHP
- #php
- #programowanie
- #publikowanie
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</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