Dzięki PHP możemy w łatwy i przyjemny sposób obsłużyć pliki uploadowane na serwer.
Jednak, by prawidłowo wysłać plik, niezbędny będzie odpowiedni formularz HTML.
Konstrukcja formularza musi spełniać następujące warunki:
enctype=”multipart/form-data”
, który musimy dodać, by móc wysłać plik.
POST
<input type="hidden" name="MAX_FILE_SIZE" value="512000">
<input type="file" name="plik">
<input type="submit" name="wyslij" value="Wyślij formularz">
Przykładowy formularz zakładania konta z możliwością dodania awatara użytkownika może przedstawiać się następująco:
(w ramkach umieszczono elementy charakterystyczne dla formularza z wysyłaniem plików)
Po wysłaniu pliku na serwer, w zmiennej superglobalnej $_FILES
pojawia się nowy rekord $_FILES['plik']
.
Zawiera on tablicę informacji o wysłanym pliku.
Te informacje to:
$_FILES['plik']['size']
$_FILES['plik']['name']
(oryginalna nazwa pliku)$_FILES['plik']['tmp_name']
(generowana jest unikatowa nazwa z rozszerzeniem tmp,
plik umieszczany jest w systemowym katalogu tymczasowym
$_FILES['plik']['error']
$_FILES['plik']['type']
function test() {
if ($_FILES['plik']['type'] != 'image/jpeg') {
echo "To nie jest grafika JPG";
return false;
}
return true;
}
bool is_uploaded_file(string nazwa_pliku)
- funkcja sprawdza, czy pracujemy na pliku dopiero co wysłanym na serwer.
Funkcja zwraca TRUE jeśli plik o nazwie nazwa_pliku został przysłany (upload) przez HTTP POST.
To pomaga upewnić się, czy złośliwy użytkownik nie próbuje oszukać skryptu pracującego na plikach,
tak aby działał on na plikach, na których nie powinien -- na przykład /etc/passwd.
Ten rodzaj testów jest szczególnie ważny jeśli istnieje szansa, że cokolwiek robimy z przysłanymi plikami może zdradzić ich treść użytkownikowi lub nawet innym użytkownikom tego samego systemu.
Do prawidłowego działania, funkcja is_uploaded_file() wymaga argumentu jak $_FILES['plik']['tmp_name']
(tymczasowa nazwa i lokaliczaja pliku).
Podanie oryginalnej nazwy przysyłanego pliku z komputera klienta $_FILES['plik']['name'] nie zadziała.
bool move_uploaded_file($zrodlo, $cel)
- funkcja przenosi z lokalizacji tymczasowej $zrodlo
do lokalizacji docelowej $cel.
Plik można przenieść pod nazwą oryginalną, jednak pamiętać należy, że kilku użytkowników może przesłać pliki pod takimi samymi nazwami.
Spowoduje to nadpisanie istniejących plików bez informacji ze strony systemu.
Musimy zadbać o to, aby nazwy plików nie pokrywały się.
Przykład procedury kopiującej pliki:
$cel = "./pliki/".rand(1000,9999).$_FILES['plik']['name'];
if(!move_uploaded_file($_FILES['plik']['tmp_name'], $cel)) {
echo "Nie udało się skopiować pliku do katalogu.";
}
Zastosowana została tutaj funkcja rand(1000,9999)
, która generuje losową liczbę z przedziału 1000...9999
i umieszcza ją przed oryginalną nazwą pliku.