web-dev-qa-db-fra.com

Comment télécharger le fichier csv sur IE? Fonctionne sur Firefox

Je me bats avec une étrange erreur. J'ai une application Web simple qui récupère des éléments d'une base de données puis les génère sous forme de fichier csv téléchargeable. Il fonctionne sur Firefox et Chrome, mais IE ne parvient pas à le reconnaître en tant que fichier csv (pensant qu'il s'agit d'un fichier html) et lorsque je clique sur enregistrer, j'obtiens l'erreur "Impossible de télécharger {nom du fichier} de {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 type de contenu tout un tas, mais cela n'a eu aucun effet.

Mise à jour: J'ai essayé text/csv, application/vnd.ms-Excel (et ses variantes), text/plain et quelques autres que j'oublie maintenant sans chance.

C'est IE8 btw.

Mise à jour 2: la connexion est via SSL.

34
tau-neutrino

N'aimons-nous pas 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 force IE pour télécharger le fichier.

56
Caissy

Nous avons récemment rencontré ce problème nous-mêmes. Voir ceci article MSKB

Ce sont les en-têtes que nous avons finalement dû utiliser pour le faire fonctionner 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));
6
jasonbar

J'ai réussi avec les éléments suivants:

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

Définir le type sur application/vnd.ms-Excel semblait faire l'affaire dans mon cas. Tout cela dans un fichier ouvert en soumettant un formulaire en utilisant

target="_blank"
4
Jason

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

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

Nous venons d'avoir le même problème et après avoir ajouté de nombreux en-têtes et obtenu un lien de travail, je les ai supprimés un par un et j'ai trouvé que la clé pour nous était "Cache-Control: public", donc à la fin, nous venons d'avoir

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

qui a bien fonctionné.

2
davidu

Essayez de définir votre type de contenu sur text/csv au lieu de application/octet-stream.

Étant donné que l'application/octet-stream est un type mime binaire générique (et ne correspond pas à l'extension '.csv'), Internet Explorer peut l'ignorer et calculer le type mime en fonction de l'extension de fichier.

1
Seth

La solution pour moi était:

header_remove(); 
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename=brokerlist.csv'); 
echo $content;
0
Frankos