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";
balaweblog
la source

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.

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

Le type MIME du CSV est text / csv selon RFC 4180 .

sastanin
la source
62

Utiliser text/csvcomme type de contenu.

ibz
la source
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");
dangereux
la source
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 ...

diclophis
la source
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();
GateKiller
la source
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");
}
Rob Church
la source
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');
Wookie
la source
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.


la source
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.

Jaider
la source
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.
Suresh Kamrushi
la source