Przejdź do treści

Listowanie plików w katalogu (strona pobierania)

  • Pliki i obrazy
  • poziom: początkujący
  • aktualizacja: 12 lipca 2026

Sekcja „Pliki do pobrania" — cenniki, regulaminy, formularze PDF — nie potrzebuje bazy danych. Wystarczy katalog na serwerze i ten skrypt: sam wykryje pliki, pokaże ich rozmiar w ludzkim formacie i datę aktualizacji. Dodanie nowego pliku to po prostu wgranie go przez FTP.

PHP 95 linii Pobierz .php
<?php
/**
 * Listowanie plików w katalogu — skryptyPHP.com
 * Zapisz jako: do-pobrania.php
 */

// ── USTAWIENIA ──────────────────────────────────────────────
// Katalog z plikami — podkatalog obok tego skryptu.
// NIGDY nie bierz ścieżki katalogu z $_GET — to otwiera dostęp
// do wszystkich plików na serwerze!
$katalog     = __DIR__ . '/do-pobrania';
$katalog_www = 'do-pobrania'; // ta sama lokalizacja jako adres URL

// Pliki o tych rozszerzeniach pokażemy na liście
$pokazuj = ['pdf', 'doc', 'docx', 'xls', 'xlsx', 'zip', 'jpg', 'png', 'txt'];

/** Rozmiar pliku w czytelnej postaci: 15,3 KB, 2,1 MB itd. */
function rozmiar_czytelny(int $bajty): string
{
    $jednostki = ['B', 'KB', 'MB', 'GB'];
    $i = 0;
    $rozmiar = (float) $bajty;
    while ($rozmiar >= 1024 && $i < count($jednostki) - 1) {
        $rozmiar /= 1024;
        $i++;
    }
    return number_format($rozmiar, $i === 0 ? 0 : 1, ',', ' ')
         . ' ' . $jednostki[$i];
}

// ── ZEBRANIE LISTY PLIKÓW ───────────────────────────────────
$pliki = [];

if (is_dir($katalog)) {
    foreach (new DirectoryIterator($katalog) as $element) {
        if (!$element->isFile()) {
            continue;
        }
        $rozszerzenie = strtolower($element->getExtension());
        if (!in_array($rozszerzenie, $pokazuj, true)) {
            continue;
        }
        $pliki[] = [
            'nazwa'        => $element->getFilename(),
            'rozszerzenie' => $rozszerzenie,
            'rozmiar'      => $element->getSize(),
            'zmieniono'    => $element->getMTime(),
        ];
    }
}

// Sortowanie: najnowsze na górze (zamień na 'nazwa', jeśli wolisz alfabetycznie)
usort($pliki, fn(array $a, array $b): int => $b['zmieniono'] <=> $a['zmieniono']);
?>
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Pliki do pobrania</title>
<style>
    body   { font-family: sans-serif; max-width: 720px; margin: 20px auto; }
    table  { border-collapse: collapse; width: 100%; }
    th, td { border-bottom: 1px solid #ddd; padding: 10px 8px; text-align: left; }
    th     { background: #f5f5f5; }
    .typ   { display: inline-block; padding: 2px 8px; border-radius: 4px;
             background: #eee; font-size: 12px; text-transform: uppercase; }
</style>
</head>
<body>

<h1>Pliki do pobrania</h1>

<?php if (!$pliki): ?>
    <p>Brak plików do pobrania.</p>
<?php else: ?>
    <table>
        <tr><th>Plik</th><th>Typ</th><th>Rozmiar</th><th>Aktualizacja</th></tr>
        <?php foreach ($pliki as $p): ?>
            <tr>
                <td>
                    <a href="<?= htmlspecialchars($katalog_www) ?>/<?= rawurlencode($p['nazwa']) ?>" download>
                        <?= htmlspecialchars($p['nazwa']) ?>
                    </a>
                </td>
                <td><span class="typ"><?= htmlspecialchars($p['rozszerzenie']) ?></span></td>
                <td><?= rozmiar_czytelny($p['rozmiar']) ?></td>
                <td><?= date('d.m.Y', $p['zmieniono']) ?></td>
            </tr>
        <?php endforeach; ?>
    </table>
<?php endif; ?>

</body>
</html>

Jak użyć tego skryptu

  1. Utwórz obok skryptu katalog do-pobrania/ i wgraj do niego pliki (FTP lub menedżer plików hostingu).
  2. Zapisz kod jako do-pobrania.php i otwórz w przeglądarce — lista zbuduje się sama.
  3. Listę widocznych rozszerzeń zmienisz w tablicy $pokazuj, a sortowanie w wywołaniu usort().

Warto wiedzieć

  • Ścieżka katalogu jest na sztywno w kodzie — i tak ma zostać. Pobieranie ścieżki z adresu URL (?katalog=...) to klasyczna dziura typu path traversal.
  • Nazwy plików w linkach przechodzą przez rawurlencode(), a wyświetlane — przez htmlspecialchars(); spacje i polskie znaki w nazwach nie zepsują strony.
  • Atrybut download w linku podpowiada przeglądarce pobieranie zamiast otwierania — działa dla plików z tej samej domeny.
  • Jeśli w katalogu wylądują pliki, których nie chcesz listować, po prostu usuń ich rozszerzenie z tablicy $pokazuj.
#pliki #katalog #pobieranie #directoryiterator #lista

Podobne skrypty