Je dois envoyer un fichier CSV en réponse HTTP. Comment définir la réponse en sortie au format CSV?
Cela ne fonctionne pas:
Response.ContentType = "application/CSV";
Utiliser text/csv
est le type le plus approprié.
Vous devriez également envisager d'ajouter un en-tête Content-Disposition
à la réponse. Souvent, un texte/csv sera chargé par un Internet Explorer directement dans une instance hébergée d'Excel. Cela peut ou peut ne pas ê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 pourrait correspondre à vos attentes.
Le type MIME du CSV est text/csv selon RFC 4180 .
Utilisez text/csv
comme type de contenu.
Au fil des ans, j'ai perfectionné pour cela des en-têtes parfaits qui fonctionnent avec brio dans 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");
Essayez l'un de ces autres types de mime (à partir d'ici: http://filext.com/file-extension/CSV )
En outre, le type mime pourrait être sensible à la casse ...
Juste utiliser comme ça
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
Dans ASP.net MVC, vous pouvez utiliser une méthode FileContentResult
et la méthode File
:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
J'ai constaté que le problème avec IE est qu'il renifle les données de retour et se décide par quel type de contenu il pense avoir été envoyé. Cela entraîne un certain nombre d'effets secondaires, tels que l'ouverture constante d'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');
La définition du type de contenu et de la disposition du contenu, comme décrit ci-dessus, produit des résultats extrêmement variables avec différents navigateurs:
IE8: boîte de dialogue Enregistrer sous si vous le souhaitez et Excel comme application par défaut. 100% bien.
Firefox: la boîte de dialogue Enregistrer sous apparaît, mais Firefox n’a aucune idée qu’il s’agit d’un tableur. Suggère de l'ouvrir avec Visual Studio! 50% bon
Chrome: les astuces sont complètement ignorées. Les données CSV sont affichées dans le navigateur. 0% bon.
Bien sûr, dans tous ces cas, je me réfère aux navigateurs lorsqu'ils sortent de leur boîte, sans personnalisation des mappages mime/application.
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.
Pour C # MVC 4.5, vous devez procéder comme suit:
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.