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.';
}