Ce face readfile
readfile afișează conținutul unui fișier, bucată cu bucată, și returnează numărul de octeți trimiși. Spre deosebire de echo file_get_contents(...), nu păstrează tot fișierul în memorie, deci merge și pentru fișiere mari.
Este funcția folosită de obicei pentru descărcări: trimiți întâi antetele (Content-Type, Content-Disposition), apoi apelezi readfile.
Parametri
| Parametru | Descriere |
|---|---|
$filename |
Fișierul trimis. |
$use_include_path |
Opțional. true caută fișierul și în include_path. |
$context |
Opțional. Un context de stream. |
Ce returnează
Numărul de octeți citiți sau false la eroare.
Exemple
Exemplul 1: Afișarea unui fișier
<?php
file_put_contents("anunt.txt", "Magazinul este închis luni.\n");
$octeti = readfile("anunt.txt");
echo "($octeti octeți)";
Rezultat
Magazinul este închis luni.
(29 octeți)
Exemplul 2: Descărcarea unei facturi
Pe server, browserul primește fișierul ca descărcare cu numele ales.
<?php
$fisier = __DIR__ . "/facturi/factura-1024.pdf";
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=\"factura-1024.pdf\"");
header("Content-Length: " . filesize($fisier));
readfile($fisier);
exit;
Rezultat în browser
Browserul descarcă fișierul factura-1024.pdf.
Greșeli frecvente
- Afișezi text sau HTML înainte de
readfileîntr-o descărcare. Textul intră în fișierul descărcat și îl strică. Nu afișa nimic altceva și oprește scriptul cuexitdupă. - Pui numele fișierului direct din
$_GET. Oricine poate descărca orice fișier de pe server. Foloseștebasenameși un director fix.
Comenzi înrudite
fpassthru: Trimite la ieșire tot restul unui fișier deschis, de la poziția curentă până la final.file_get_contents: Citește tot conținutul unui fișier (sau al unei adrese URL) într-un text.basename: Returnează doar numele fișierului dintr-o cale, fără directoare.filesize: Returnează dimensiunea unui fișier, în octeți.