Type de contenu de réponse au format CSV


328

J'ai besoin d'envoyer un fichier CSV en réponse HTTP. Comment puis-je définir la réponse de sortie au format CSV?

Cela ne fonctionne pas:

Response.ContentType = "application/CSV";

Réponses:


491

L'utilisation text/csvest le type le plus approprié.

Vous devriez également envisager d'ajouter un en- Content-Dispositiontête à la réponse. Souvent, un texte / csv sera chargé par Internet Explorer directement dans une instance hébergée d'Excel. Cela peut ou non être un résultat souhaitable.

Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");

Ce qui précède fera apparaître une boîte de dialogue "Enregistrer sous" qui peut être celle que vous souhaitez.


2
J'aime utiliser un objet System.Net.Mime.ContentDisposition pour construire cette chaîne.
Ronnie Overby du


62

Utiliser text/csvcomme type de contenu.


48

Au fil des ans, j'ai perfectionné un ensemble parfait d'en-têtes pour cela, qui fonctionne parfaitement avec tous les navigateurs que je connais.

// these headers avoid IE problems when using https:
// see http://support.microsoft.com/kb/812935
header("Cache-Control: must-revalidate");
header("Pragma: must-revalidate");

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

7
Si vous utilisez application / vnd.ms-excel. Sur osx safari ajoute une extension de fichier ".xls"
Luke Smith

28

Essayez l'un de ces autres types MIME (à partir d'ici: http://filext.com/file-extension/CSV )

  • texte / valeurs séparées par des virgules
  • texte / csv
  • application / csv
  • application / excel
  • application / vnd.ms-excel
  • application / vnd.msexcel

En outre, le type mime peut être sensible à la casse ...


15

Utilisez simplement comme ça

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();

Mettre le nom du fichier entre guillemets a résolu ce problème pour moi lorsque le client est Firefox.
Graham

1
Si vous l'utilisez dans un contrôleur MVC, vous devrez terminer la méthode du contrôleur avec return new EmptyResult()pour obtenir le nom de fichier à coller. Sinon, IE essaiera d'enregistrer le fichier sous ActionName.htm.
3Dave

5

Dans ASP.net MVC, vous pouvez utiliser a FileContentResultet la Fileméthode:

public FileContentResult DownloadManifest() {
    byte[] csvData = getCsvData();
    return File(csvData, "text/csv", "filename.csv");
}

3

J'ai trouvé que le problème avec IE est qu'il renifle les données de retour et décide lui-même du type de contenu qu'il pense avoir été envoyé. Il y a un certain nombre d'effets secondaires que cela provoque, comme toujours ouvrir une boîte de dialogue saveAs pour les fichiers texte car vous utilisez la compression des transferts de données. La solution est (en code php) ......

header('X-Content-Type-Options: nosniff');

2

La définition du type de contenu et de la disposition du contenu comme décrit ci-dessus produit des résultats très différents avec différents navigateurs:

IE8: boîte de dialogue Enregistrer sous comme vous le souhaitez et Excel comme application par défaut. 100% bon.

Firefox: la boîte de dialogue Enregistrer sous apparaît, mais Firefox n'a aucune idée qu'il s'agit d'une feuille de calcul. Suggère de l'ouvrir avec Visual Studio! 50% bon

Chrome: les indices sont totalement ignorés. Les données CSV sont affichées dans le navigateur. 0% bon.

Bien sûr, dans tous ces cas, je fais référence aux navigateurs lorsqu'ils sortent de leur boîte, sans personnalisation des mappages mime / application.


Si Firefox veut que vous ouvriez avec Visual Studio, cela signifie que vous exportez le HTML et non un CSV.
Martin

Cela ne semble pas être le cas en 2014, cela a bien fonctionné dans chacun d'eux pour moi.
MikeKulls

Veuillez définir "comme décrit ci-dessus"
xhienne

2

Je suggère d'insérer un caractère «/» devant «monfichier.cvs»

Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv");

J'espère que vous obtenez de meilleurs résultats.


0

Pour C # MVC 4.5, vous devez faire comme ceci:

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".csv\"");
Response.Write(dataNeedToPrint);
Response.End();
return new EmptyResult();  //this line is important else it will not work.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.