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.
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.
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));
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"
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");
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é.
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.
La solution pour moi était:
header_remove();
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=brokerlist.csv');
echo $content;