La documentazione PHP fornisce un bell'esempio:
<?php
$file = 'monkey.gif';
if (file_exists($file)) {
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;
}
?>
MODIFICA (Risposta al commento, spiegazione)
header('Content-Description: File Transfer');
Non visualizzare nel browser, ma trasferire il file.
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
Il file è un file binario.
I browser generalmente scaricano file binari, a meno che non siano in grado di visualizzarli.
header('Content-Disposition: attachment; filename='.basename($file));
Fai in modo che la finestra di dialogo di download mostri il nome file corretto.
Nota:puoi utilizzare qualsiasi nome file.
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
Il file non deve essere memorizzato nella cache dal browser.
La cache potrebbe causare problemi in caso di contenuto dinamico.
header('Content-Length: ' . filesize($file));
Invia la dimensione del file corretta al browser,
altrimenti il browser non è in grado di stimare il tempo di trasferimento.
ob_clean();
flush();
Assicurati che le intestazioni vengano inviate al browser prima dell'inizio del download.
readfile($file);
Invia il file al browser.
exit;
Fatto :)