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";
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:
L'utilisation text/csv
est le type le plus approprié.
Vous devriez également envisager d'ajouter un en- Content-Disposition
tê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.
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");
Essayez l'un de ces autres types MIME (à partir d'ici: http://filext.com/file-extension/CSV )
En outre, le type mime peut être sensible à la casse ...
Utilisez simplement comme ça
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
return new EmptyResult()
pour obtenir le nom de fichier à coller. Sinon, IE essaiera d'enregistrer le fichier sous ActionName.htm
.
Dans ASP.net MVC, vous pouvez utiliser a FileContentResult
et la File
méthode:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
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');
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.
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.