[PHP] Upload plików
Tworząc strony od małych po duże serwisy często zdarza się konieczność przesłania plików. Może być to chociażby załącznik w formularzu kontaktowym. Aby była możliwość przesłania pliku na serwer musi być spełnionych kilka warunków. Po pierwsze formularz HTML musi być poprawnie utworzony - zawierać atrybuty action z wartością POST oraz enctype z wartością multipart/form-data. Kolejnym warunkiem, aby przesyłany plik mógł zostać zapisany są odpowiednie prawa katalogu docelowego - katalog musi mieć prawa zapisu dla wszystkich (777). Kolejną rzeczą jest maksymalny rozmiar pliku jaki można przesłać ustawiony w konfiguracji PHP (php.ini -> upload_max_filesize) - przesyłany plik nie może go przekraczać. Skoro podstawy już znasz, możemy przejść do przykładowego kodu, najpierw utwórzmy prosty formularz:
<form action="upload.php" method="post" enctype="multipart/form-data">
<p><label for="name">Wybierz plik</label><input type="file" name="your_file" /></p>
<p><input type="submit" value="Wyślij plik" /></p>
</form>
Utworzony został formularz z polem file. Teraz pora na skrypt PHP obsługujący wysłany formularz:
<?php
$upload_dir = 'uploads';
$filename = uniqid('file-');
$ext = '';
is_uploaded_file($_FILES['your_file']['tmp_name']) or die('Błąd podczas przesyłania pliku.');
$ext = pathinfo($_FILES['your_file']['tmp_name'], PATHINFO_EXTENSION);
if(move_uploaded_file($_FILES['your_file']['tmp_name'], '/' . $upload_dir . '/' . $filename . $ext)) {
echo 'Przesłanie pliku powiodło się.';
}
else echo 'Wystąpił błąd! Plik nie został zapisany.';
Zanim spróbujesz przesłać formularz, utwórz katalog uploads w katalogu, w którym masz skrypt upload.php i nadaj mu chmod 777.
Teraz kilka słów o powyższym kodzie. Na początku ustawiamy nasz katalog, do którego będziemy zapisywać pliki ($upload_dir). Kolejna zmienna ($filename) to nowa unikalna nazwa dla przesłanego pliku, generujemy ją funkcją uniqid. Zmienna $ext będzie przechowywać rozszerzenie przesłanego pliku. Na dalszym etapie sprawdzamy funkcją is_uploaded_file czy samo przesłanie pliku się powiodło, jeśli nie to kończymy wykonywanie dalszego kodu. Jeśli plik został pomyślnie przesłany przenosimy go funkcją move_uploaded_file do ustalonego katalogu (uploads) i zapisujemy z nowo wygenerowaną nazwą.
Zmienna $_FILES
Zmienna $_FILES zawiera tablicę asocjacyjną z informacjami o przesłanym pliku. Tablica ta przechowuje następujące wartości:
- $_FILES['file']['name'] - oryginalna nazwa pliku;
- $_FILES['file']['type'] - typ pliku (mime type);
- $_FILES['file']['size'] - rozmiar pliku w bajtach;
- $_FILES['file']['tmp_name'] - tymczasowa nazwa pliku;
- $_FILES['file']['error'] - kod błędu, lista kodów dostępna tu;
- $_FILES['file']['full_path'] - pełna ścieżka pliku podana przez przeglądarkę, może być nieprawdziwa;
Komentarze
Prześlij komentarz
Dzięki za komentarz!