Forzare il download di un file con PHP
ATTENZIONE!
Il post ha più di 2 anni e le informazioni contenute
potrebbero essere obsolete (ad esempio a causa di un
aggiornamento di versione rispetto agli elementi descritti
o links modificati da siti esterni).
Una funzione per forzare il download di un file presente sul server.
<?php
function download($path, $name = null)
{
//elenco dei mime types
$mime_types = array(
"bmp"=> "image/bmp",
"exe"=> "application/octet-stream",
"html"=> "text/html",
"ico"=> "image/x-icon",
"jpeg"=> "image/jpeg",
"mov"=> "video/quicktime",
"mp3"=> "audio/mpeg",
"mp4"=> "video/mpeg",
"mpeg"=> "video/mpeg",
"mpg"=> "video/mpeg",
"txt"=> "text/plain",
"wav"=> "audio/x-wav",
"zip"=> "application/zip"
);
//ricava l'estensione del file (senza il punto)
$ext = substr(strrchr($path,'.'),1);
//ricava il mime type dall'array
$mime_type = $mime_types[$ext];
//se non viene specificato un nome nel secondo parametro
if($name == null){
//ricava il nome del file
$name = substr($path, strrpos($path,'/'),strlen($path)-strrpos($path,'/'));
} else {
//altrimenti usa il nome specificato e concatena l'estensione
$name = $name.'.'.$ext;
}
if (headers_sent()) {
echo 'Errore : gli headers HTTP sono già stati inviati.';
exit;
}
$path = realpath($path);
//se il file non esiste
if ($path === false || !is_file($path) || !is_readable($path)) {
header('HTTP/1.0 204 No Content');
exit;
}
$size = filesize($path);//calcola dimensione del file
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Cache-Control: private');
header('Pragma: no-cache');
header("Content-Transfer-Encoding: binary");
header("Content-type: {$mime_type}");
header("Content-length: {$size}");
header("Content-disposition: attachment; filename=\"{$name}\"");
readfile($path);
exit;
}
?>
Per utilizzare la funzione è sufficiente inserire come primo parametro il percorso del file:
<?php
download('percorso_file/nome_file.txt');
?>
Se si vuole personalizzare il nome del file scaricato si deve specificare anche il secondo parametro con il nome desiderato (senza l’estensione, viene aggiunta automaticamente dalla funzione):
<?php
download('percorso_file/nome_file.txt','nome_da_visualizzare');
?>

Commenti