66 votes

Forcer à télécharger un fichier avec PHP

J'ai un CSV le fichier sur mon serveur, si un utilisateur clique sur un lien il faut télécharger, mais plutôt qu'il ouvre dans mon navigateur.

Mon code se présente comme suit

<a href="files/csv/example/example.csv">
    Click here to download an example of the "CSV" file
</a>

C'est un serveur web normal serveur où j'ai tous mes travaux de développement.

J'ai essayé quelque chose comme

<a href="files/csv/example/csv.php">
    Click here to download an example of the "CSV" file
</a>

Maintenant, le contenu de mon csv.php le fichier:

header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');

Maintenant, mon problème c'est que c'est le téléchargement, mais pas mon CSV le fichier qu'il est en train de créer un nouveau fichier.

111voto

seengee Points 9367

pour forcer brutalement le téléchargement de tous les fichiers .sv sur votre serveur, vous pouvez ajouter ceci à votre fichier .htaccess:

 AddType application/octet-stream csv
 

EDIT (une solution en ligne dans votre fichier php serait plus comme ça):

 header('Content-Type: application/csv');
header('Content-Disposition: attachment; filename=example.csv');
header('Pragma: no-cache');
readfile("/path/to/yourfile.csv");
 

28voto

AtanuCSE Points 2562

Ou vous pouvez le faire en utilisant HTML5. Simplement avec

 <a href="example.csv" download>download not open it</a>
 

17voto

Michael Borgwardt Points 181658

Cela ne peut être fait de façon fiable, puisque c'est le navigateur de décider quoi faire avec une URL, il a été demandé à récupérer.

Vous pouvez suggérer au navigateur qu'il doit se proposer d'enregistrer sur le disque" tout de suite en envoyant un en-tête Content-disposition:

header("Content-disposition: attachment");

Je ne suis pas sûr que c'est pris en charge par les différents navigateurs. L'alternative est d'envoyer un Contenu de type application/octet-stream, mais c'est un hack (vous êtes essentiellement en disant au navigateur "je ne vous dis pas quel type de fichier c'est" et selon le fait que la plupart des navigateurs offrira ensuite une boîte de dialogue de téléchargement) et les soi-disant causes des problèmes avec Internet Explorer.

Lire plus à ce sujet dans la Création Web FAQ.

Modifier Vous avez déjà opté pour un fichier PHP pour fournir les données nécessaires pour définir le Contenu de l'en-tête de disposition (sauf si il y a quelques arcanes de configuration de Apache qui peut aussi le faire). Maintenant tout ce qui reste à faire est de que fichier PHP pour lire le contenu du fichier CSV et de les imprimer - filename=example.csv dans l'en-tête uniquement suggère au client de navigateur ce nom pour le fichier, il ne fait pas de récupérer les données à partir du fichier sur le serveur.

13voto

Franz Points 5924

Voici une solution plus sécurisée pour le navigateur:

     $fp = @fopen($yourfile, 'rb');

    if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
{
	header('Content-Type: "application/octet-stream"');
	header('Content-Disposition: attachment; filename="yourname.file"');
	header('Expires: 0');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header("Content-Transfer-Encoding: binary");
	header('Pragma: public');
	header("Content-Length: ".filesize($yourfile));
}
else
{
	header('Content-Type: "application/octet-stream"');
	header('Content-Disposition: attachment; filename="yourname.file"');
	header("Content-Transfer-Encoding: binary");
	header('Expires: 0');
	header('Pragma: no-cache');
	header("Content-Length: ".filesize($yourfile));
}

fpassthru($fp);
fclose($fp);
 

8voto

Gumbo Points 279147

Configurez votre serveur pour envoyer le fichier avec le type de support application/octet-stream .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X