{"id":1207,"date":"2025-02-18T11:49:57","date_gmt":"2025-02-18T10:49:57","guid":{"rendered":"https:\/\/piotrgabriel.pl\/wiki\/?p=1207"},"modified":"2025-02-18T11:49:57","modified_gmt":"2025-02-18T10:49:57","slug":"wgrywanie-plikow-na-serwer-w-php-system-uploadu-plikow","status":"publish","type":"post","link":"https:\/\/piotrgabriel.pl\/wiki\/wgrywanie-plikow-na-serwer-w-php-system-uploadu-plikow\/","title":{"rendered":"Wgrywanie plik\u00f3w na serwer w PHP \u2013 system uploadu plik\u00f3w"},"content":{"rendered":"<p data-pm-slice=\"1 3 []\">W tym poradniku nauczysz si\u0119, jak stworzy\u0107 system <strong>wgrywania plik\u00f3w na serwer w PHP<\/strong>. Wgrywanie plik\u00f3w na serwer ma wiele praktycznych zastosowa\u0144, o kt\u00f3rych ni\u017cej.<\/p>\n<p data-pm-slice=\"1 3 []\">Wdro\u017cymy dwa oddzielne formularze: jeden do przesy\u0142ania plik\u00f3w graficznych (JPG, PNG, GIF) o maksymalnym rozmiarze 1MB, a drugi do przesy\u0142ania innych typ\u00f3w plik\u00f3w (TXT, PDF). Ka\u017cdy przes\u0142any plik pojawi si\u0119 na li\u015bcie dost\u0119pnych plik\u00f3w z mo\u017cliwo\u015bci\u0105 pobrania i usuni\u0119cia.<\/p>\n<h3>Zastosowanie w praktyce<\/h3>\n<p>Takie rozwi\u0105zanie jest niezwykle przydatne w r\u00f3\u017cnych scenariuszach, np.:<\/p>\n<ul data-spread=\"false\">\n<li><strong>Portale spo\u0142eczno\u015bciowe<\/strong> \u2013 umo\u017cliwia u\u017cytkownikom dodawanie zdj\u0119\u0107 do swoich profili.<\/li>\n<li><strong>Systemy zarz\u0105dzania dokumentami<\/strong> \u2013 pozwala na przechowywanie i pobieranie plik\u00f3w tekstowych oraz PDF-\u00f3w.<\/li>\n<li><strong>Sklepy internetowe<\/strong> \u2013 umo\u017cliwia administratorom dodawanie grafik produkt\u00f3w.<\/li>\n<li><strong>Systemy rekrutacyjne<\/strong> \u2013 pozwala kandydatom na przesy\u0142anie CV i innych dokument\u00f3w aplikacyjnych.<\/li>\n<li><strong>Serwisy edukacyjne<\/strong> \u2013 pozwala studentom na przesy\u0142anie projekt\u00f3w i prac zaliczeniowych.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2 data-pm-slice=\"1 1 []\">1. Tworzenie katalog\u00f3w do przechowywania plik\u00f3w<\/h2>\n<p>Aby zacz\u0105\u0107, musimy utworzy\u0107 kilka katalog\u00f3w. Rozwi\u0105zanie z przyk\u0142adu, tworzy katalog, na zdj\u0119cia oraz katalog na inne pliki (tutaj txt i pdf).<\/p>\n<p>Od razu warto wspomnie\u0107 o wadzie tego rozwi\u0105zania (opisanego w przyk\u0142adzie), co w p\u00f3\u017aniejszym kroku, przy okazji naprawimy.<\/p>\n<p>Ot\u00f3\u017c wad\u0105 jest brak podkatalog\u00f3w, wszystkie zdj\u0119cia b\u0119d\u0105 uploadowane do jednego folderu, tak samo pliki TXT czy PDF. W momencie, gdy plik\u00f3w b\u0119dzie bardzo du\u017co, setki tysi\u0119cy i wi\u0119cej, wp\u0142ynie to znacz\u0105co na zu\u017cycie pami\u0119ci RAM, gdy\u017c wszystkie pliki z katalogu musz\u0105 si\u0119 zaindeksowa\u0107, by mo\u017cna by\u0142o je wy\u015bwietli\u0107.<\/p>\n<p>Najpierw utw\u00f3rzmy dwa katalogi na serwerze:<\/p>\n<p><code>mkdir uploads<\/code><br \/>\n<code>mkdir uploads\/images<\/code><br \/>\n<code>mkdir uploads\/other<\/code><\/p>\n<h2 data-pm-slice=\"1 1 []\">2. Formularze do przesy\u0142ania plik\u00f3w<\/h2>\n<h3>Formularz do wgrywania obrazk\u00f3w (max. 1MB)<\/h3>\n<p>Sam formularz, nie pilnuje rozmiaru pliku, t\u0119 czynno\u015b\u0107 b\u0119dziemy mogli dowolnie ustawia\u0107 w skrypcie &#8211; mechanizmie &#8211; wysy\u0142aj\u0105cym (pkt 3).<\/p>\n<p><code>&lt;form action=\"upload.php\" method=\"post\" enctype=\"multipart\/form-data\"&gt;<\/code><br \/>\n<code>&lt;label for=\"image\"&gt;Wybierz obrazek (JPG, PNG, GIF, max. 1MB):&lt;\/label&gt;<\/code><br \/>\n<code>&lt;input type=\"file\" name=\"image\" accept=\"image\/jpeg, image\/png, image\/gif\" required&gt;<\/code><br \/>\n<code>&lt;button type=\"submit\" name=\"upload_image\"&gt;Prze\u015blij&lt;\/button&gt;<\/code><br \/>\n<code>&lt;\/form&gt;<\/code><\/p>\n<h3 data-pm-slice=\"1 1 []\">Formularz do wgrywania innych plik\u00f3w (TXT, PDF)<\/h3>\n<p><code>&lt;form action=\"upload.php\" method=\"post\" enctype=\"multipart\/form-data\"&gt;<\/code><br \/>\n<code>&lt;label for=\"file\"&gt;Wybierz plik (TXT, PDF):&lt;\/label&gt;<\/code><br \/>\n<code>&lt;input type=\"file\" name=\"file\" accept=\".txt, .pdf\" required&gt;<\/code><br \/>\n<code>&lt;button type=\"submit\" name=\"upload_file\"&gt;Prze\u015blij&lt;\/button&gt;<\/code><br \/>\n<code>&lt;\/form&gt;<\/code><\/p>\n<h2 data-pm-slice=\"1 1 []\">3. Obs\u0142uga wgrywania plik\u00f3w (upload.php)<\/h2>\n<p><code>&lt;?php<\/code><br \/>\n<code>session_start();<\/code><br \/>\n<code>if (!isset($_SESSION['user_id'])) {<\/code><br \/>\n<code>header(\"Location: login.php\");<\/code><br \/>\n<code>exit();<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>$upload_dir_images = \"uploads\/images\/\";<\/code><br \/>\n<code>$upload_dir_other = \"uploads\/other\/\";<\/code><br \/>\n<code>$max_file_size = 1048576; \/\/ 1MB<\/code><\/p>\n<p><code>if (isset($_POST['upload_image']) &amp;&amp; isset($_FILES['image'])) {<\/code><br \/>\n<code>$file = $_FILES['image'];<\/code><br \/>\n<code>$file_ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));<\/code><br \/>\n<code>$allowed_ext = [\"jpg\", \"jpeg\", \"png\", \"gif\"];<\/code><\/p>\n<p><code>if (in_array($file_ext, $allowed_ext) &amp;&amp; $file['size'] &lt;= $max_file_size) {<\/code><br \/>\n<code>$file_path = $upload_dir_images . basename($file['name']);<\/code><br \/>\n<code>move_uploaded_file($file['tmp_name'], $file_path);<\/code><br \/>\n<code>echo \"Obrazek zosta\u0142 przes\u0142any.\";<\/code><br \/>\n<code>} else {<\/code><br \/>\n<code>echo \"Nieprawid\u0142owy format lub zbyt du\u017cy plik.\";<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>if (isset($_POST['upload_file']) &amp;&amp; isset($_FILES['file'])) {<\/code><br \/>\n<code>$file = $_FILES['file'];<\/code><br \/>\n<code>$file_ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));<\/code><br \/>\n<code>$allowed_ext = [\"txt\", \"pdf\"];<\/code><\/p>\n<p><code>if (in_array($file_ext, $allowed_ext)) {<\/code><br \/>\n<code>$file_path = $upload_dir_other . basename($file['name']);<\/code><br \/>\n<code>move_uploaded_file($file['tmp_name'], $file_path);<\/code><br \/>\n<code>echo \"Plik zosta\u0142 przes\u0142any.\";<\/code><br \/>\n<code>} else {<\/code><br \/>\n<code>echo \"Nieprawid\u0142owy format pliku.\";<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><br \/>\n<code>?&gt;<\/code><\/p>\n<h2 data-pm-slice=\"1 1 []\">4. Wy\u015bwietlanie listy przes\u0142anych plik\u00f3w i umo\u017cliwienie ich pobrania lub usuni\u0119cia (files.php)<\/h2>\n<p><code>&lt;?php<\/code><br \/>\n<code>session_start();<\/code><br \/>\n<code>if (!isset($_SESSION['user_id'])) {<\/code><br \/>\n<code>header(\"Location: login.php\");<\/code><br \/>\n<code>exit();<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>$upload_dirs = [<\/code><br \/>\n<code>\"uploads\/images\" =&gt; \"Obrazy\",<\/code><br \/>\n<code>\"uploads\/other\" =&gt; \"Inne pliki\"<\/code><br \/>\n<code>];<\/code><\/p>\n<p><code>if (isset($_GET['delete'])) {<\/code><br \/>\n<code>$file_path = $_GET['delete'];<\/code><br \/>\n<code>if (file_exists($file_path)) {<\/code><br \/>\n<code>unlink($file_path);<\/code><br \/>\n<code>echo \"Plik zosta\u0142 usuni\u0119ty.\";<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><br \/>\n<code>?&gt;<\/code><\/p>\n<p><code>&lt;!DOCTYPE html&gt;<\/code><br \/>\n<code>&lt;html lang=\"pl\"&gt;<\/code><br \/>\n<code>&lt;head&gt;<\/code><br \/>\n<code>&lt;meta charset=\"UTF-8\"&gt;<\/code><br \/>\n<code>&lt;title&gt;Lista plik\u00f3w&lt;\/title&gt;<\/code><br \/>\n<code>&lt;\/head&gt;<\/code><br \/>\n<code>&lt;body&gt;<\/code><br \/>\n<code>&lt;h2&gt;Lista przes\u0142anych plik\u00f3w&lt;\/h2&gt;<\/code><br \/>\n<code>&lt;?php foreach ($upload_dirs as $dir =&gt; $label): ?&gt;<\/code><br \/>\n<code>&lt;h3&gt;&lt;?php echo $label; ?&gt;&lt;\/h3&gt;<\/code><br \/>\n<code>&lt;ul&gt;<\/code><br \/>\n<code>&lt;?php<\/code><br \/>\n<code>$files = scandir($dir);<\/code><br \/>\n<code>foreach ($files as $file) {<\/code><br \/>\n<code>if ($file !== '.' &amp;&amp; $file !== '..') {<\/code><br \/>\n<code>echo \"&lt;li&gt;&lt;a href='$dir\/$file' download&gt;$file&lt;\/a&gt; \";<\/code><br \/>\n<code>echo \"&lt;a href='?delete=$dir\/$file' onclick='return confirm(\\\"Usun\u0105\u0107 plik?\\\");'&gt;[Usu\u0144]&lt;\/a&gt;&lt;\/li&gt;\";<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><br \/>\n<code>?&gt;<\/code><br \/>\n<code>&lt;\/ul&gt;<\/code><br \/>\n<code>&lt;?php endforeach; ?&gt;<\/code><br \/>\n<code>&lt;\/body&gt;<\/code><br \/>\n<code>&lt;\/html&gt;<\/code><\/p>\n<h2 data-pm-slice=\"1 1 []\">5. Tworzenie katalog\u00f3w z dat\u0105 wgrywania plik\u00f3w<\/h2>\n<p>wspomniana poprawka. Czyli zapisywanie plik\u00f3w do katalog\u00f3w z dat\u0105 ich dodania, w celu rozproszenia liczby plik\u00f3w w poszczeg\u00f3lnych katalogach. To rozwi\u0105zanie przyspieszy indeksacj\u0119 plik\u00f3w, nie b\u0119dzie ryzyka wysycania pami\u0119ci RAM do indeksacji plik\u00f3w w danym katalogu.<\/p>\n<p>Warto wspomnie\u0107 jednak, \u017ce nie jest to rozwi\u0105zanie konieczne dla ka\u017cdego katalogu plik\u00f3w. Nie wszystkie sytuacje bowiem, wymagaj\u0105 takiego rozwi\u0105zania i cz\u0119sto, te podstawowe, wcze\u015bniej opisane, b\u0119dzie wystarczaj\u0105ce.<\/p>\n<p data-pm-slice=\"1 1 []\">Aby uporz\u0105dkowa\u0107 pliki wed\u0142ug daty przes\u0142ania, ka\u017cda przesy\u0142ka zostanie zapisana w katalogu o nazwie odpowiadaj\u0105cej dacie w formacie <code>YYYY-MM-DD<\/code>. Dodajemy nast\u0119puj\u0105ce modyfikacje w <code>upload.php<\/code>:<\/p>\n<p><code>$today = date(\"Y-m-d\");<\/code><br \/>\n<code>$target_dir = \"uploads\/$today\/\";<\/code><\/p>\n<p><code>if (!is_dir($target_dir)) {<\/code><br \/>\n<code>mkdir($target_dir, 0777, true);<\/code><br \/>\n<code>}<\/code><\/p>\n<p data-pm-slice=\"1 1 []\">Plik zostanie przes\u0142any do odpowiedniego katalogu:<\/p>\n<p data-pm-slice=\"1 1 []\"><code>$file_path = $target_dir . basename($file['name']);<\/code><br \/>\n<code>move_uploaded_file($file['tmp_name'], $file_path);<\/code><\/p>\n<p data-pm-slice=\"1 1 []\">Oto pe\u0142na, zmodyfikowana wersja <code data-start=\"32\" data-end=\"44\">upload.php<\/code>, kt\u00f3ra obs\u0142uguje tworzenie katalog\u00f3w wed\u0142ug daty oraz poprawnie zapisuje pliki w odpowiednich lokalizacjach:<\/p>\n<p><code>&lt;?php<\/code><br \/>\n<code>session_start();<\/code><br \/>\n<code>if (!isset($_SESSION['user_id'])) {<\/code><br \/>\n<code>header(\"Location: login.php\");<\/code><br \/>\n<code>exit();<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>$max_file_size = 1048576; \/\/ 1MB<\/code><br \/>\n<code>$today = date(\"Y-m-d\"); \/\/ Pobranie aktualnej daty w formacie YYYY-MM-DD<\/code><br \/>\n<code>$target_dir = \"uploads\/$today\/\"; \/\/ Tworzenie katalogu dla danej daty<\/code><\/p>\n<p><code>if (!is_dir($target_dir)) {<\/code><br \/>\n<code>mkdir($target_dir, 0777, true);<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>\/\/ Obs\u0142uga wgrywania obrazk\u00f3w<\/code><br \/>\n<code>if (isset($_POST['upload_image']) &amp;&amp; isset($_FILES['image'])) {<\/code><br \/>\n<code>$file = $_FILES['image'];<\/code><br \/>\n<code>$file_ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));<\/code><br \/>\n<code>$allowed_ext = [\"jpg\", \"jpeg\", \"png\", \"gif\"];<\/code><\/p>\n<p><code>if (in_array($file_ext, $allowed_ext) &amp;&amp; $file['size'] &lt;= $max_file_size) {<\/code><br \/>\n<code>$file_path = $target_dir . basename($file['name']);<\/code><br \/>\n<code>if (move_uploaded_file($file['tmp_name'], $file_path)) {<\/code><br \/>\n<code>echo \"Obrazek zosta\u0142 przes\u0142any.\";<\/code><br \/>\n<code>} else {<\/code><br \/>\n<code>echo \"B\u0142\u0105d podczas przesy\u0142ania pliku.\";<\/code><br \/>\n<code>}<\/code><br \/>\n<code>} else {<\/code><br \/>\n<code>echo \"Nieprawid\u0142owy format lub zbyt du\u017cy plik.\";<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>\/\/ Obs\u0142uga wgrywania innych plik\u00f3w (TXT, PDF)<\/code><br \/>\n<code>if (isset($_POST['upload_file']) &amp;&amp; isset($_FILES['file'])) {<\/code><br \/>\n<code>$file = $_FILES['file'];<\/code><br \/>\n<code>$file_ext = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));<\/code><br \/>\n<code>$allowed_ext = [\"txt\", \"pdf\"];<\/code><\/p>\n<p><code>if (in_array($file_ext, $allowed_ext)) {<\/code><br \/>\n<code>$file_path = $target_dir . basename($file['name']);<\/code><br \/>\n<code>if (move_uploaded_file($file['tmp_name'], $file_path)) {<\/code><br \/>\n<code>echo \"Plik zosta\u0142 przes\u0142any.\";<\/code><br \/>\n<code>} else {<\/code><br \/>\n<code>echo \"B\u0142\u0105d podczas przesy\u0142ania pliku.\";<\/code><br \/>\n<code>}<\/code><br \/>\n<code>} else {<\/code><br \/>\n<code>echo \"Nieprawid\u0142owy format pliku.\";<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><br \/>\n<code>?&gt;<\/code><\/p>\n<h3 data-start=\"1791\" data-end=\"1813\">Co zosta\u0142o dodane:<\/h3>\n<ul data-start=\"1814\" data-end=\"2064\">\n<li data-start=\"1814\" data-end=\"1884\"><strong data-start=\"1816\" data-end=\"1860\">Tworzenie katalogu z dat\u0105 (<code data-start=\"1845\" data-end=\"1857\">YYYY-MM-DD<\/code>)<\/strong> przed zapisaniem pliku.<\/li>\n<li data-start=\"1885\" data-end=\"1952\"><strong data-start=\"1887\" data-end=\"1951\">Sprawdzanie istnienia katalogu i jego automatyczne tworzenie<\/strong>.<\/li>\n<li data-start=\"1953\" data-end=\"2064\"><strong data-start=\"1955\" data-end=\"1997\">Obs\u0142uga b\u0142\u0119d\u00f3w przy przesy\u0142aniu plik\u00f3w<\/strong>, aby unikn\u0105\u0107 przypadk\u00f3w, gdy plik nie zostanie zapisany poprawnie.<\/li>\n<\/ul>\n<p data-start=\"2066\" data-end=\"2185\" data-is-last-node=\"\">Teraz pliki b\u0119d\u0105 organizowane w katalogach zgodnie z dat\u0105 przes\u0142ania, co u\u0142atwi zarz\u0105dzanie danymi i ich segregacj\u0119.<\/p>\n<h2 data-pm-slice=\"1 1 []\">6. Wy\u015bwietlanie plik\u00f3w z podkatalog\u00f3w w <code>files.php<\/code><\/h2>\n<p>Aby poprawnie listowa\u0107 pliki ze wszystkich katalog\u00f3w wed\u0142ug daty, zmieniamy spos\u00f3b ich przeszukiwania:<\/p>\n<p><code>function listFiles($dir) {<\/code><br \/>\n<code>$items = scandir($dir);<\/code><br \/>\n<code>foreach ($items as $item) {<\/code><br \/>\n<code>if ($item !== '.' &amp;&amp; $item !== '..') {<\/code><br \/>\n<code>$path = \"$dir\/$item\";<\/code><br \/>\n<code>if (is_dir($path)) {<\/code><br \/>\n<code>echo \"&lt;h3&gt;Pliki z dnia: $item&lt;\/h3&gt;&lt;ul&gt;\";<\/code><br \/>\n<code>listFiles($path);<\/code><br \/>\n<code>echo \"&lt;\/ul&gt;\";<\/code><br \/>\n<code>} else {<\/code><br \/>\n<code>echo \"&lt;li&gt;&lt;a href='$path' download&gt;$item&lt;\/a&gt; \";<\/code><br \/>\n<code>echo \"&lt;a href='?delete=$path' onclick='return confirm(\\\"Usun\u0105\u0107 plik?\\\");'&gt;[Usu\u0144]&lt;\/a&gt;&lt;\/li&gt;\";<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><br \/>\n<code>}<\/code><\/p>\n<p><code>listFiles(\"uploads\");<\/code><\/p>\n<p>Oto kod zmodyfikowanego pliku <strong>files.php<\/strong>:<\/p>\n<div>\n<div><code>&lt;?php<\/code><\/div>\n<div><code>session_start();<\/code><\/div>\n<div><code>if (!isset($_SESSION['user_id'])) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 header(\"Location: login.php\");<\/code><\/div>\n<div><code>\u00a0 \u00a0 exit();<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>$upload_dirs = [<\/code><\/div>\n<div><code>\u00a0 \u00a0 \"uploads\/images\" =&gt; \"Obrazy\",<\/code><\/div>\n<div><code>\u00a0 \u00a0 \"uploads\/other\" =&gt; \"Inne pliki\"<\/code><\/div>\n<div><code>];<\/code><\/div>\n<div><code>if (isset($_GET['delete'])) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 $file_path = $_GET['delete'];<\/code><\/div>\n<div><code>\u00a0 \u00a0 if (file_exists($file_path)) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 unlink($file_path);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 echo \"Plik zosta\u0142 usuni\u0119ty.\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>function listFiles($dir) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 $items = scandir($dir);<\/code><\/div>\n<div><code>\u00a0 \u00a0 foreach ($items as $item) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 if ($item !== '.' &amp;&amp; $item !== '..') {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $path = \"$dir\/$item\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if (is_dir($path)) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \"&lt;h3&gt;Pliki z dnia: $item&lt;\/h3&gt;&lt;ul&gt;\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 listFiles($path);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \"&lt;\/ul&gt;\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 } else {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \"&lt;li&gt;&lt;a href='$path' download&gt;$item&lt;\/a&gt; \";<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \"&lt;a href='?delete=$path' onclick='return confirm(\\\"Usun\u0105\u0107 plik?\\\");'&gt;[Usu\u0144]&lt;\/a&gt;&lt;\/li&gt;\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 }<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><code>listFiles(\"uploads\");<\/code><\/div>\n<div><code>?&gt;<\/code><\/div>\n<div><code>&lt;!DOCTYPE html&gt;<\/code><\/div>\n<div><code>&lt;html lang=\"pl\"&gt;<\/code><\/div>\n<div><code>&lt;head&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;meta charset=\"UTF-8\"&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;title&gt;Lista plik\u00f3w&lt;\/title&gt;<\/code><\/div>\n<div><code>&lt;\/head&gt;<\/code><\/div>\n<div><code>&lt;body&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;h2&gt;Lista przes\u0142anych plik\u00f3w&lt;\/h2&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;?php foreach ($upload_dirs as $dir =&gt; $label): ?&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 &lt;h3&gt;&lt;?php echo $label; ?&gt;&lt;\/h3&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 &lt;ul&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 &lt;?php<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 $files = scandir($dir);<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 foreach ($files as $file) {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 if ($file !== '.' &amp;&amp; $file !== '..') {<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \"&lt;li&gt;&lt;a href='$dir\/$file' download&gt;$file&lt;\/a&gt; \";<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 echo \"&lt;a href='?delete=$dir\/$file' onclick='return confirm(\\\"Usun\u0105\u0107 plik?\\\");'&gt;[Usu\u0144]&lt;\/a&gt;&lt;\/li&gt;\";<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 }<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ?&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 \u00a0 \u00a0 &lt;\/ul&gt;<\/code><\/div>\n<div><code>\u00a0 \u00a0 &lt;?php endforeach; ?&gt;<\/code><\/div>\n<div><code>&lt;\/body&gt;<\/code><\/div>\n<div><code>&lt;\/html&gt;<\/code><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2 data-pm-slice=\"1 1 []\">Podsumowanie<\/h2>\n<p data-pm-slice=\"1 1 []\">Stworzyli\u015bmy prosty system wgrywania plik\u00f3w w PHP, kt\u00f3ry umo\u017cliwia:<\/p>\n<ul data-spread=\"false\">\n<li>Przesy\u0142anie plik\u00f3w graficznych do 1MB.<\/li>\n<li>Przesy\u0142anie innych plik\u00f3w, np. TXT i PDF.<\/li>\n<li>Wy\u015bwietlanie listy przes\u0142anych plik\u00f3w.<\/li>\n<li>Pobieranie i usuwanie plik\u00f3w z serwera.<\/li>\n<\/ul>\n<p>W jego podstawowej wersji, pliki graficzne s\u0105 uploadowane do folderu upload\/images oraz pliki TXT i PDF do upload\/other.<\/p>\n<p>W rozszerzonej \/ zmodyfikowanej wersji, folder other i images zosta\u0142y pomini\u0119te na rzecz folderu zawieraj\u0105cego dat\u0119 wgrania plik\u00f3w na serwer, co polepsza indeksacj\u0119 ale jak wspomnia\u0142em wy\u017cej, nie jest rozwi\u0105zaniem niezb\u0119dnym do funkcjonowania skryptu.<\/p>\n<p>Podsumowuj\u0105c, teraz u\u017cytkownicy mog\u0105 w bezpieczny spos\u00f3b przesy\u0142a\u0107 i zarz\u0105dza\u0107 plikami na stronie.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W tym poradniku nauczysz si\u0119, jak stworzy\u0107 system wgrywania plik\u00f3w na serwer w PHP. Wgrywanie plik\u00f3w na serwer ma wiele praktycznych zastosowa\u0144, o kt\u00f3rych ni\u017cej. Wdro\u017cymy dwa oddzielne formularze: jeden do przesy\u0142ania plik\u00f3w graficznych (JPG, PNG, GIF) o maksymalnym rozmiarze [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1208,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[244],"tags":[67],"class_list":["post-1207","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-php","tag-php"],"_links":{"self":[{"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/posts\/1207","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/comments?post=1207"}],"version-history":[{"count":1,"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/posts\/1207\/revisions"}],"predecessor-version":[{"id":1209,"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/posts\/1207\/revisions\/1209"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/media\/1208"}],"wp:attachment":[{"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/media?parent=1207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/categories?post=1207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/piotrgabriel.pl\/wiki\/wp-json\/wp\/v2\/tags?post=1207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}