kursy , szkolenia warszawa , e-book , audio book , poradniki , jak zarabiać , pieniądze , biznes , marketing e-commerce , e-biznes , zarabianie w sieci , servicetek group Bogdan Markowicz SG ,3 d e-learning , second life w edukacji , edukacja , 3d
Jeśli dysponujemy kontem WWW np. w Interii lub Lycos, na pewno spotkaliśmy się z klientem FTP dostępnym z poziomu przeglądarki WWW. Nie jest to jednak zbyt praktyczne rozwiązanie, szczególnie gdy chcemy umieszczać na stronie pliki o dużym rozmiarze, ale świetnie się ono sprawdza w wypadku małych zbiorów, takich jak pliki HTML. Spróbujmy coś takiego napisać.
Należy zacząć od przygotowania formularza, w którym odwiedzający wskaże pliki do wysłania. W znaczniku form należy umieścić informację, że wysyłane będą dane (enctype=?multipart/form-data?); ważne jest również to, by wartość metody ustawić na post. Na końcu należy dodać komponent typu file, dzięki któremu gość wskaże plik do wysłania.
Plik formularz.html:
| <form enctype=”multipart/form-data” action=”up.php” method=”post”> <input type=”file” name=”plik”> <input type=”submit” value=”Wyślij na serwer”> </form> |
Po wysłaniu danych w pliku up.php dostępna będzie wielowymiarowa tablica $_FILES ? pierwszym wymiarem będą nazwy pól file z formularza, a drugim następujące dane o wysłanym pliku:
Wyjaśnić należy chyba tylko błąd numer 2. W formularzu, z którego wysyłane będą pliki, można umieścić pole typu hidden o nazwie MAX_FILE_SIZE, gdzie należy podać maksymalną wielkość pliku do wysłania. Dla przykładu:
| <input type=”hidden” name=”MAX_FILE_SIZE” value=”30000″ /> |
MAX_FILE_SIZE zależne jest od przeglądarki i nie można na nim polegać w stu procentach. Na przykład wczesne wersje Firefoksa nic sobie nie robiły z obecności takiego pola i pozwalały wysłać plik. PHP sprawdza jednak wielkość pliku i wyświetla błąd nr 2.
Przyszedł czas na zbiór up.php ? dzięki niemu plik jest odbierany i zapisywany na serwerze.
| <? $uploaded = “var/www/uploady/”. $_FILES['plik']['name']; if (is_uploaded_file($_FILES['plik']['tmp_name'])) { if ($_FILES['plik']['size'] > 1024*1024*1024) { echo ‘Plik jest za duży’; } else { move_uploaded_file($_FILES['plik']['tmp_name'],$uploaded); echo “Operacja przebiegła pomyślnie”; } } else { echo ‘Błąd przy przesyłaniu danych!’; } ?> |
Najpierw należy sprawdzić, czy plik został na pewno wysłany przez formularz. W przeciwnym wypadku istnieje możliwość ominięcia zabezpieczeń i uruchomienia np. dowolnego skryptu PHP. Jeśli plik nie został wysłany, pokazywany jest błąd. Następnie sprawdzana jest wielkość pliku, która na poniższym przykładzie nie może przekroczyć 1 MB ? 1073741824 bajtów. Jeśli jego wielkość jest większa, pokazywany jest błąd. Jeżeli nie, to plik zostaje przeniesiony na właściwe miejsce i wypisywane jest potwierdzenie, że operacja przebiegła pomyślnie.
Skrypt, który odbiera plik, powinien zawierać kod określający, co stanie się z wysłanym plikiem. Możemy więc usunąć pliki za duże lub za małe. Dla przykładu:
| if ($_FILES['plik']['size'] > 1073741824 |
lub odebrać tylko pliki graficzne:
| if ($_FILES['plik']['type']==”image/jpeg” || $_FILES['plik']['type']==”image/gif”)) |
Pamiętajmy, że od PHP 4.2.0 możemy używać funkcji $_FILES['plik']['error'], aby sprawdzić, co poszło nie tak.
Jeśli podczas uploadu plików odkryjemy, że tablica $_FILES jest pusta, to oznacza, iż wielkość przesyłanego pliku przekracza wielkość ustawioną w dyrektywie post_max_size pliku php.ini.
Jeśli potrzebujemy wysłać więcej niż jeden plik z formularza, możemy się posłużyć jedną z dwóch metod: nadać każdemu komponentowi file inną nazwę lub wykorzystać tablicę. Oto zmodyfikowany plik formularz.html:
| <form enctype=”multipart/form-data” action=”up.php” method=”post”> <input type=”file” name=”plik[]“> <input type=”file” name=”plik[]“> <input type=”file” name=”plik[]“> <input type=”submit” value=”Wyślij na serwer”> </form> |
A oto up.php po drobnych przeróbkach:
<?
for ($i=0; $i<sizeof($_FILES['plik']['size']); $i++) {
if ($_FILES['plik']['size'][$i] !=0) {
$uploaded = “var/www/uploady/”. $_FILES['plik']['name'][$i];
if (is_uploaded_file($_FILES['plik']['tmp_name'][$i])) {
if ($_FILES['plik']['size'][$i] > 1024*1024*1024) {
echo “Plik numer $i jest za duży<br />”;
} else {
move_uploaded_file($_FILES['plik']['tmp_name'][$i],
$uploaded);
echo “Operacja wysyłania pliku $i
przebiegła pomyślnie<br />”;
}
} else {
echo “Błąd przy przesyłaniu danych w pliku $i!<br />”;
}
}
}
?>