Comment démarrer automatiquement un téléchargement en PHP ?
-
09-06-2019 - |
Question
Quel code devez-vous ajouter en PHP pour que le navigateur télécharge automatiquement un fichier sur la machine locale lorsqu'un lien est visité ?
Je pense notamment à des fonctionnalités similaires à celles des sites de téléchargement qui invitent l'utilisateur à enregistrer un fichier sur le disque une fois qu'il clique sur le nom du logiciel ?
La solution
Envoyez les en-têtes suivants avant de sortir le fichier :
header("Content-Disposition: attachment; filename=\"" . basename($File) . "\"");
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($File));
header("Connection: close");
@grom:Intéressant pour le type MIME 'application/octet-stream'.Je n'étais pas au courant, j'ai toujours simplement utilisé 'application/force-download' :)
Autres conseils
Voici un exemple de renvoi d'un pdf.
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="' . basename($filename) . '"');
header('Content-Transfer-Encoding: binary');
readfile($filename);
@Bruissement Je n'ai pas trouvé de type de contenu d'application/téléchargement forcé pour faire quelque chose de différent (testé dans IE et Firefox).Y a-t-il une raison pour ne pas renvoyer le type MIME réel ?
Également dans le manuel PHP Hayley Watson posté :
Si vous souhaitez forcer le téléchargement et l'enregistrement d'un fichier, au lieu d'être rendu, rappelez-vous qu'il n'existe pas de type MIME tel que "application/force-download".Le type correct à utiliser dans cette situation est "application/octet-stream", et utiliser autre chose repose simplement sur le fait que les clients sont censés ignorer les types MIME non reconnus et utiliser "application/octet-stream" à la place (référence :Sections 4.1.4 et 4.5.1 de la RFC 2046).
Également selon IANA il n’y a pas d’application enregistrée/type de téléchargement forcé.
Un exemple propre.
<?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);
?>
mon code fonctionne pour les extensions txt,doc,docx,pdf,ppt,pptx,jpg,png,zip et je pense qu'il est préférable d'utiliser explicitement les types MIME réels.
$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);