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 ?

Était-ce utile?

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top