<!DOCTYPE html>
<html>
<head>
<title>Upload</title>
</head>
<body>
<div>
<form enctype="multipart/form-data" action="index.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="50000" />
<input name="plik" type="file" />
<input type="submit" value="Wyślij plik" />
</form>
</div>
<?php
$plik_tmp = $_FILES['plik']['tmp_name'];
$plik_nazwa = $_FILES['plik']['name'];
$plik_rozmiar = $_FILES['plik']['size'];
if(is_uploaded_file($plik_tmp)) {
move_uploaded_file($plik_tmp, "upload/$plik_nazwa");
echo "Plik: <strong>$plik_nazwa</strong> o rozmiarze
<strong>$plik_rozmiar bajtów</strong> został przesłany na serwer!";
}
?>
</body>
</html>
Na co należy zwrócić uwagę:
- parametr enctype znacznika form ustawiamy na multipart/form-data, inaczej PHP w ogóle nie podejmie się uploadowania pliku, dostaniemy normalną tablicę $_POST
- ukryty input o nazwie MAX_FILE_SIZE, który określa maksymalny rozmiar pliku, jeśli ten zostanie przekroczony upload nie dojdzie do skutku
- input typu file, który pozwala na przeglądanie własnego dysku i wybór pliku do przesłania
W powyższym przykładzie parametr action znacznika form przekierowuje do tego samego pliku *.php z którego został wysłany plik z dysku i jednocześnie odpowiada za jego przenoszenie.
Jeśli plik z formularza jest prawidłowo wysłany (co sprawdza funkcja is_uploaded_file();) to przy pomocy funkcji move_uploaded_file(); przenosimy go w wybrane miejsce na serwerze. Argumentem dla funkcji is_uploaded_file(); jest ścieżka do wysyłanego pliku, która jet pobierana z tablicy $_FILES. Tablica $_FILES jest tworzona po wysłaniu pliku i zawiera następujące informacje:
- $_FILES['userfile']['name'] - nazwa pliku
- $_FILES['userfile']['type'] - typ pliku
- $_FILES['userfile']['tmp_name'] - ścieżka na serwerze do uploadowanego pliku
- $_FILES['userfile']['error'] - numer błędu (jeśli brak błędów wartość wynosi 0)
- $_FILES['userfile']['size'] - rozmiar pliku w bajtach
Bez problemu można wysyłać więcej niż jeden plik, gdyż wszystkie dane będą umieszczone w tablicy. Po pozytywnym sprawdzeniu, czy plik jest na serwerze, możemy go wysłać w wybrane miejsce funkcją move_uploaded_file(); Funkcja ta ma 2 argumenty: bieżąca, tymczasowa ścieżka do pliku na serwerze i ścieżka do nowego miejsca na serwerze. Najlepiej żeby to była ścieżka bezwzględna (pełna ścieżka systemowa).
Dodać należy tylko, że folder "upload" do którego kopiujemy plik na serwer powinien mieć prawa do zapisu dla wszystkich (chmod 777).