[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

Popular

[HTML] Jak wstawić obrazek?

[C++] Jak obliczyć pole i obwód trapezu?

[JavaScript|Node.js] Generowanie kodów QR w Node.js z użyciem biblioteki qrcode