Forcer le téléchargement d'un fichier
Lorsqu'on veut permettre le téléchargement d'un fichier depuis un site internet, il y a un problème avec les types connus (.txt, .pdf, .doc, .xls, ...) qui ont la facheuse tendance à s'ouvrir dans le navigateur.
Ce petit morceau de script permet de forcer le téléchargement, ce qui peut être fort utile.
<?
$fichier = 'repertoire/fichier.ext';
// Nous extrayons les informations grâce à $fichier
$fichier_nom = basename($fichier);
$fichier_taille = filesize($fichier);
$fichier_mime = mime_content_type($fichier);
// téléchargement du fichier
header("Content-disposition: attachment; filename=$fichier_nom");
header("Content-Type: $fichier_mime");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $fichier_taille");
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Expires: 0");
readfile($fichier);
?>
N.B. Le bon fonctionnement de ce script est dépendant du navigateur et de son respect des normes.
$fichier = 'repertoire/fichier.ext';
// Nous extrayons les informations grâce à $fichier
$fichier_nom = basename($fichier);
$fichier_taille = filesize($fichier);
$fichier_mime = mime_content_type($fichier);
// téléchargement du fichier
header("Content-disposition: attachment; filename=$fichier_nom");
header("Content-Type: $fichier_mime");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $fichier_taille");
header("Pragma: no-cache");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Expires: 0");
readfile($fichier);
?>
En ce qui concerne mime_content_type, vous pouvez vous rapporter à l'astuce Retrouver le type mime
Ce système peut être utilisé en tant que fonction, ce qui est plus pratique:
function sendfile($url,$named,$size) {
$mime = mime_content_type($url);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // requis pour certains browsers
header("Content-type: ".$mime);
if ($size != 0) {
header("Content-Length: ".$size);
}
header("Content-Disposition: attachment; filename=\"$named\"");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: binary");
header("Location: $url");
}
$mime = mime_content_type($url);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false); // requis pour certains browsers
header("Content-type: ".$mime);
if ($size != 0) {
header("Content-Length: ".$size);
}
header("Content-Disposition: attachment; filename=\"$named\"");
header("Content-Type: application/force-download");
header("Content-Transfer-Encoding: binary");
header("Location: $url");
}