Wysyłanie obrazka
Podstawowy formularz HTML, służący do uploadowania plików, pokazałem Ci na poprzedniej lekcji. Teraz wykorzystamy go do wysłania grafiki na serwer. Wkleję jego kod raz jeszcze:
<form enctype="multipart/form-data" action="plik.php" method="post" > <input type="hidden" name="MAX_FILE_SIZE" value="512000" /> <input type="file" name="obrazek" /> <input type="submit" value="wyślij" /> </form>
Pierwszą rzeczą, od której powinniśmy zacząć, jest sprawdzenie, czy nie wystąpiły błędy podczas wysyłania. Wszystkie błędy zapisują się w zmiennej$_FILES[’obrazek’][’error’]. Jedyne, co musimy zrobić, to sprawdzić jej wartość. Możemy to zrobić w sposób następujący:
<?php function sprawdz_bledy() { if ($_FILES['obrazek']['error'] > 0) { echo 'problem: '; switch ($_FILES['obrazek']['error']) { // jest większy niż domyślny maksymalny rozmiar, // podany w pliku konfiguracyjnym case 1: {echo 'Rozmiar pliku jest zbyt duży.'; break;} // jest większy niż wartość pola formularza // MAX_FILE_SIZE case 2: {echo 'Rozmiar pliku jest zbyt duży.'; break;} // plik nie został wysłany w całości case 3: {echo 'Plik wysłany tylko częściowo.'; break;} // plik nie został wysłany case 4: {echo 'Nie wysłano żadnego pliku.'; break;} // pozostałe błędy default: {echo 'Wystąpił błąd podczas wysyłania.'; break;} } return false; } return true; } ?>
Istnieją jeszcze trzy inne błędy, ale występują bardzo rzadko. Możesz przeczytać więcej o błędach na stronie php.net (niestety jedynie w języku angielskim). Nie zmienia to faktu, że dla prawidłowo wysłanego pliku wartość zmiennej $_FILES[’obrazek’][’error’] nie będzie większa niż zero – z tego wynika, że funkcja zwróci TRUE.
Sprawdzanie typu pliku
Po sprawdzeniu, czy nie wystąpiły żadne błędy, należy sprawdzić, czy plik jest we właściwym formacie. Nas interesuje obrazek, powiedzmy, że ma to być grafika z rozszerzeniem .jpg. Musimy więc sprawdzić typ wysłanego pliku. Warto tutaj wspomnieć, że typ pliku to nie to samo, co rozszerzenie. Każdy plik ma nagłówki MIME. Nawet zmieniając rozszerzenie na jakieś inne, typ pliku wciąż zostanie prawidłowo rozpoznany.
Poniżej sprawdzimy, czy wysłany plik jest obrazkiem typu jpeg.
<?php function sprawdz_typ() { if ($_FILES['obrazek']['type'] != 'image/jpeg') return false; return true; } ?>
Zapisywanie obrazka na serwerze
Jeżeli do tej pory nie wystąpiły żadne komplikacje, plik obrazkowy został wysłany na nasz serwer. Znajduje się on jednak w folderze plików tymczasowych, który jest opróżniany po zamknięciu sesji. Musimy go zapisać do żądanej lokacji.
Możemy tego dokonać w następujący sposób:
<?php function zapisz_plik() { $lokalizacja = './temp/plik_obrazkowy.jpg'; if(is_uploaded_file($_FILES['obrazek']['tmp_name'])) { if(!move_uploaded_file($_FILES['obrazek']['tmp_name'], $lokalizacja)) { echo 'problem: Nie udało się skopiować pliku do katalogu.'; return false; } } else { echo 'problem: Możliwy atak podczas przesyłania pliku.'; echo 'Plik nie został zapisany.'; return false; } return true; } ?>
Przeanalizujmy teraz powyższy skrypt. Najpierw, w zmiennej $lokalizacja wpisujemy ścieżkę, gdzie chcemy plik zapisać (podając również nazwę pliku). Funkcja is_uploaded_file() sprawdza, czy pracujemy na pliku dopiero co wysłanym na serwer. Jest to dodatkowe zabezpieczenie przez włamaniami.
Jeżeli tak, funkcją move_uploaded_file($zrodlo, $cel) zapisujemy plik z adresu ze zmiennej $zrodlo do adresu $cel. Jeżeli się nie powiedzie, wyświetlamy stosowny komunikat i zwracamy false. Podobnie w przypadku, gdy pracujemy na złym pliku. Jeżeli wszystko pójdzie zgodnie z planem, na samym końcu funkcji zwracana jest wartość true.
Wiesz już w jaki sposób wysłać plik za pomocą PHP, sprawdzić, czy jest prawidłowy, po czym zapisać go w stosowne miejsce. Teraz czas podsumować nabytą wiedzę.
Spis lekcji w rozdziale szóstym
Poprzednia lekcja: Wysyłanie plików na serwer | Następna lekcja: Zabezpieczanie skryptu |