34 votes

Comment faire pour que le fichier csv se télécharge sur IE ? Fonctionne sur firefox

Je suis confronté à une erreur étrange. J'ai une application web simple qui récupère des données d'une base de données et les affiche dans un fichier csv téléchargeable. Cela fonctionne sur Firefox et Chrome, mais IE ne le reconnaît pas comme un fichier csv (pensant qu'il s'agit d'un fichier html) et lorsque je clique sur Enregistrer, j'obtiens l'erreur suivante : "Impossible de télécharger {nom du fichier} depuis {nom du site}. Impossible d'ouvrir ce site internet. ..."

Code :

session_start();

//some logic goes here...  

//generate csv header  
header("Content-type: application/octet-stream");  
header("Content-Disposition: attachment; filename=exportevent.csv");  
header("Pragma: no-cache");  
header("Expires: 0");  

echo "Event: " . $event_title . "\n";  

//print the column names  
echo "Last Name, First Name, Company \n";  

while($row = mysql_fetch_assoc($result))  
{  
    echo $row['atlname'] . ',' . $row['atfname'] . ',' . $row['atcompany'] . "\n";      
}

J'ai joué avec le content-type un tas de fois, mais cela n'a eu aucun effet.

Mise à jour : J'ai essayé text/csv, application/vnd.ms-excel (et ses variantes), text/plain, et d'autres que j'ai oublié sans succès.

Il s'agit d'IE8.

Mise à jour 2 : La connexion se fait par SSL.

56voto

Caissy Points 656

N'aimons-nous pas l'IE ? :)

Essayez d'utiliser ces en-têtes :

  header("Pragma: public");
  header("Expires: 0");
  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  header("Cache-Control: private",false);
  header("Content-Type: application/octet-stream");
  header("Content-Disposition: attachment; filename=\"exportevent.csv\";" );
  header("Content-Transfer-Encoding: binary"); 

Je pense que le type de contenu octet-stream oblige IE à télécharger le fichier.

6voto

jasonbar Points 7212

Nous avons récemment été confrontés à ce problème. Voir ce Article du MSKB

Ce sont les en-têtes que nous avons dû utiliser pour que cela fonctionne sur SSL.

header("Expires: Sat, 01 Jan 2000 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$file_name\";");
header("Content-length: " . strlen($csv_string));

4voto

Randoogle Points 31

Le seul code supplémentaire que j'ai dû ajouter pour qu'IE fonctionne avec SSL était : header("Pragma: public"); Mes en-têtes ressemblent donc à ceci maintenant :

 header("Pragma: public");  
 header("Content-Type: application/octet-stream");
 header("Content-Disposition: attachment; filename=some_filename.csv");

4voto

Jason Points 4252

J'ai eu du succès avec ce qui suit :

header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=File.csv");

Le réglage du type sur application/vnd.ms-excel a semblé faire l'affaire dans mon cas. Tout ceci se trouve dans un fichier qui s'ouvre en soumettant un formulaire à l'aide de la commande

target="_blank"

2voto

davidu Points 19

Nous venons d'avoir le même problème et après avoir ajouté de nombreux en-têtes et obtenu un lien fonctionnel, je les ai supprimés un par un et j'ai trouvé que le plus important pour nous était le suivant "Cache-Control : public" Au final, nous n'avions que

header("Cache-Control: public"); 
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=some_filename.csv");

ce qui a bien fonctionné.

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