Come avviare automaticamente un download in PHP?
-
09-06-2019 - |
Domanda
Quale codice devi aggiungere in PHP per fare in modo che il browser scarichi automaticamente un file sul computer locale quando viene visitato un collegamento?
Sto pensando nello specifico a funzionalità simili a quelle dei siti di download che chiedono all'utente di salvare un file su disco una volta cliccato sul nome del software?
Soluzione
Invia le seguenti intestazioni prima di generare il file:
header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");
@grom:Interessante il tipo MIME "application/octet-stream".Non ne ero a conoscenza, ho sempre usato semplicemente 'application/force-download' :)
Altri suggerimenti
Ecco un esempio di invio di un pdf.
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);
@Swish Non ho riscontrato che il tipo di contenuto di applicazione/download forzato esegua operazioni diverse (testato in IE e Firefox).C'è un motivo per non restituire il tipo MIME effettivo?
Anche nel manuale PHP Hayley Watson pubblicato:
Se desideri forzare il download e il salvataggio di un file, invece che il rendering, ricorda che non esiste un tipo MIME come "application/force-download".Il tipo corretto da utilizzare in questa situazione è "application/octet-stream", e l'utilizzo di qualsiasi altra cosa si basa semplicemente sul fatto che i client dovrebbero ignorare i tipi MIME non riconosciuti e utilizzare invece "application/octet-stream" (riferimento:Sezioni 4.1.4 e 4.5.1 della RFC 2046).
Anche secondo IANA non esiste un tipo di applicazione/download forzato registrato.
Un esempio pulito.
<?php
header('Content-Type: application/download');
header('Content-Disposition: attachment; filename="example.txt"');
header("Content-Length: " . filesize("example.txt"));
$fp = fopen("example.txt", "r");
fpassthru($fp);
fclose($fp);
?>
il mio codice funziona con le estensioni txt,doc,docx,pdf,ppt,pptx,jpg,png,zip e penso che sia meglio usare esplicitamente i tipi MIME effettivi.
$file_name = "a.txt";
// extracting the extension:
$ext = substr($file_name, strpos($file_name,'.')+1);
header('Content-disposition: attachment; filename='.$file_name);
if(strtolower($ext) == "txt")
{
header('Content-type: text/plain'); // works for txt only
}
else
{
header('Content-type: application/'.$ext); // works for all extensions except txt
}
readfile($decrypted_file_path);