readfile

funkcja

Wysyła zawartość pliku bezpośrednio na wyjście i zwraca liczbę zapisanych bajtów. Wydajna przy pobieraniu plików.

readfile(string $filename, bool $use_include_path = false, ?resource $context = null): int|false

readfile odczytuje plik i wysyła jego zawartość bezpośrednio na wyjście — nie musisz samodzielnie otwierać uchwytu ani wypisywać danych. Funkcja zwraca liczbę wysłanych bajtów lub false przy błędzie. To wydajne rozwiązanie do serwowania plików do pobrania.

Bezpieczeństwo: nigdy nie przekazuj danych od użytkownika bezpośrednio jako $filename. Zawsze sprawdzaj, czy ścieżka mieści się wewnątrz dozwolonego katalogu (np. przez realpath), by unikać ataków path-traversal.

<?php
declare(strict_types=1);

$dozwolonyKatalog = __DIR__ . '/pliki/';
$nazwa = basename($_GET['plik'] ?? '');
$sciezka = realpath($dozwolonyKatalog . $nazwa);

if ($sciezka === false || !str_starts_with($sciezka, $dozwolonyKatalog)) {
    http_response_code(403);
    exit('Brak dostępu.');
}

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $nazwa . '"');

$bajty = readfile($sciezka);

if ($bajty === false) {
    http_response_code(500);
    echo 'Nie można odczytać pliku.';
}