In un vecchio articolo abbiamo visto come forzare il download di un file utilizzando ASP. Recentemente mi è stato chiesto come fare la stessa cosa utilizzando il PHP… ecco, quindi, questo breve e semplice articolo che vi spiegherà, appunto, come forzare il download di un file utilizzando PHP.
Mediante il codice che vedremo sarà, quindi, possibile obbligare il browser del nostro utente ad aprire un determinato collegamento come finestra di download anche se si tratta di un documento che, normalmente, il nostro browser andrebbe a visualizzare (ad esempio un file .doc, .xml, .txt, ecc.).
Per ottenere questo risultato sarà sufficiente agire sugli header mediante un codice che usermo come "filtro" tra l’utente ed il file che vogliamo venga scaricato. Vediamo come:
<?php
// definisco una variabile con il percorso alla cartella
// in cui sono archiviati i file
$dir = "/root/www/download/";
// Recupero il nome del file dalla querystring
// e lo accodo al percorso della cartella del download
$fn = (isset($_GET['filename']) ? $_GET['filename'] : false);
// controllo la sintassi del file richiesto
if (!preg_match('/^[a-z0-9]+\.[a-z]{2,3}$/i',$fn)) {
$fn = false;
}else{
$file = $dir . $fn;
}
// verifico che il file esista
if (!file_exists($file))
{
// se non esiste stampo un errore
echo "Il file non esiste!";
}else{
// Se il file esiste...
// Imposto gli header della pagina per forzare il download del file
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename= " . $file);
header("Content-Transfer-Encoding: binary");
// Leggo il contenuto del file
readfile($file);
}
?>
Salviamo questo codice come force-download.php ed utilizziamolo in questo modo:
force-download.php?filename=miofile.doc
Così facendo noterete che il file .doc del nostro esempio non verrà aperto nel browser il quale si limiterà ad aprire la finestra di dialogo per l’inizio del download.