Comment utiliser le type MIME CSV?

125

Dans une application Web sur laquelle je travaille, l'utilisateur peut cliquer sur un lien vers un fichier CSV. Il n'y a pas d'en-tête défini pour le type mime, donc le navigateur le restitue simplement sous forme de texte. Je souhaite que ce fichier soit envoyé sous forme de fichier .csv, afin que l'utilisateur puisse l'ouvrir directement avec calc, excel, gnumeric, etc.

header('Content-Type: text/csv');
echo "cell 1, cell 2";

Ce code fonctionne comme prévu sur mon ordinateur (n'est-ce pas toujours comme ça?) Mais ne fonctionne pas sur un autre ordinateur.

Mon navigateur est une version nocturne de FF 3.0.1 (sous Linux). Les navigateurs avec lesquels il ne fonctionnait pas étaient IE 7 et FF 3.0 (sous Windows)

Y a-t-il des bizarreries dont je ne suis pas conscient?

Tadeck
la source

Réponses:

219

Vous pouvez essayer de forcer le navigateur à ouvrir une boîte de dialogue "Enregistrer sous ..." en faisant quelque chose comme:

header('Content-type: text/csv');
header('Content-disposition: attachment;filename=MyVerySpecial.csv');
echo "cell 1, cell 2";

Ce qui devrait fonctionner sur la plupart des principaux navigateurs.

Sean Bright
la source
12

Vous ne spécifiez pas de langue ou de cadre, mais l'en-tête suivant est utilisé pour les téléchargements de fichiers:

"Content-Disposition: attachment; filename=abc.csv"
gimel
la source
5

Avec Internet Explorer, vous devez souvent spécifier l'en-tête Pragma: public pour que le téléchargement fonctionne correctement.

header('Pragma: public');

Juste mes 2 cents ...

4 niveaux
la source
5
Pragma: public n'a aucun sens pour Internet Explorer. (J'ai travaillé sur le composant en question, et j'ai salué la source).
EricLaw
Peut-être que l'utilité réelle de ceci est de remplacer un Pragma préexistant: no-cache header?
Fait le
2

Ce code peut être utilisé pour exporter n'importe quel fichier, y compris csv

// application/octet-stream tells the browser not to try to interpret the file
header('Content-type: application/octet-stream');
header('Content-Length: ' . filesize($data));
header('Content-Disposition: attachment; filename="export.csv"');
Yuri Korolov
la source
2
"octetstream" est censé être "octet-stream"
EricLaw
2
Cela peut provoquer un avertissement dans certains navigateurs: Ressource interprétée comme Document mais transférée avec application de type MIME / octet-stream
mikeschuld