Upload plików w PHP
Z artykułu dowiemy się jak z poziomu przeglądarki internetowej z pomocą PHP wrzucić (zuploadować) dowolny plik na serwer.
W artykule skorzystamy z funkcji move_uploaded_file.
Na samym wstępie proponuje utworzyć formularz w html, dzięki któremu będziemy mogli wskazać plik do wysłania.
formularz.html
![]()
<form method="post" action="wyslij.php" enctype="multipart/form-data">
<input type="hidden" name="MAX_FILE_SIZE" value="1024">
Wybierz plik do wysłania:
<input type="file" name="plik" size="30"><br>
<input type="submit" value="Wyślij">
Jedyne co wymaga wyjaśnienia to:
![]()
<input type="hidden" name="MAX_FILE_SIZE" value="1024">
Jest to ukryte pole które ustala maxymalną wielkość (w bajtach) jaką może mieć przesyłany plik, w moim przykładzie 1024 :)
![]()
<input type="file" name="plik" size="30"><br>
Wartość name z powyższego fragmentu u mnie <b>plik</b> będzie przekazywana do skryptu PHP, co będzie zresztą później widać.
To tyle z html teraz przejdźmy do skryptu php, który zajmie się przesłaniem pliku z naszego dysku na serwer. Jest to dosłownie linijka kodu.
wyslij.php
![]()
<?php
move_uploaded_file($_FILES['plik']['tmp_name'], "wyslane/".$_FILES['plik']['name']);
?>
Jak to działa ?
Aby przesłać plik przekazujemy funkcji dwie informacje: - Tymczasowa nazwa pliku przydzielona przez serwer - Miejsce zachowania pliku
W tym celu wykorzystujemy tablicę $_FILES. Powyższy kod spowoduje zapisanie wybranego pliku w folderze wyslane pod jego oryginalną nazwą.
Uwaga
Folder do którego wysyłany jest plik musi mieć odpowiednie prawa zapisu (777).
Oto jakie informacje można jeszcze uzyskać z tablicy $_FILES:
- $_FILES['userfile']['name'] - nazwa wysyłanego pliku
- $_FILES['userfile']['type'] - typ wysyłanego pliku
- $_FILES['userfile']['size'] - rozmiar wysyłanego pliku w bajtach
- $_FILES['userfile']['tmp_name'] - tymczasowa nazwa pliku przydzielona przez serwer
- $_FILES['userfile']['error'] - kod błędu jeżeli jakiś wystąpił
'userfile' jest to wartość parametru name="" ustalona w formularzu html. W moim przykladzie name="plik".
Nie można zapomnieć o funkcji która sprawdzi czy wysyłany plik został poprawnie zapisany na serwerze. Skrypt który to sprawdzi wygląda następująco, a funkcja która się tym zajmuje to is_uploaded_file.
![]()
<?php
if (!is_uploaded_file($_FILES['plik']['tmp_name'])) {
![]()
die ('Nie wysłano pliku, spróbuj później.');
![]()
}
?>
Uwaga
Należy zauważyć, że ten skrypt jest wolny od zabezpieczeń i jeżeli folder do którego wysyłamy pliki jest dostępny z przeglądarki potencjalny włamywacz może wysłac niebezpieczny skrypt *.php i go wykonać. Najlepszym rozwiązaniem jest utworzyć folder poza drzewem katalogów i w nim trymac uploadowane pliki.
poprawiona wersja kodu:
![]()
<?php
$rot = $_SERVER['DOCUMENT_ROOT'];
![]()
move_uploaded_file($_FILES['plik']['tmp_name'], "$rot/../wyslane/".$_FILES['plik']['name']);
?>
Źródło:
http://pl.php.net/manual/en/function.is-uploaded-file.php http://pl.php.net/move_uploaded_file http://pl.php.net/manual/en/function.is-uploaded-file.php







