Ich muss eine CSV-Datei in HTTP-Antwort senden. Wie kann ich die Ausgabeantwort als CSV-Format einstellen?
Das funktioniert nicht:
Response.ContentType = "application/CSV";
text/csv
ist der am besten geeignete Typ.
Sie sollten auch in Betracht ziehen, der Antwort einen Content-Disposition
-Header hinzuzufügen. Häufig wird ein Text/csv von einem Internet Explorer direkt in eine gehostete Instanz von Excel geladen. Dies kann ein wünschenswertes Ergebnis sein oder nicht.
Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");
Daraufhin wird ein Dialogfeld "Speichern unter" angezeigt, das möglicherweise Ihren Wünschen entspricht.
Der MIME-Typ des CSV ist text/csv gemäß RFC 4180 .
Verwenden Sie text/csv
als Inhaltstyp.
Im Laufe der Jahre habe ich einen perfekten Satz von Kopfzeilen entwickelt, der in allen mir bekannten Browsern hervorragend funktioniert
// 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");
Probieren Sie einen dieser anderen Mime-Typen (von hier: http://filext.com/file-extension/CSV )
Auch der Mime-Typ eventuell muss die Groß- und Kleinschreibung berücksichtigen ...
Verwenden Sie einfach so
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
In ASP.net-MVC können Sie eine FileContentResult
- und die File
-Methode verwenden:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
Ich habe festgestellt, dass das Problem mit IE darin besteht, dass die zurückgegebenen Daten erfasst werden und sich selbst darüber entscheiden, von welchem Inhaltstyp sie gesendet wurde. Es gibt eine Reihe von Nebeneffekten, die dadurch verursacht werden, z. B. das Öffnen eines SaveAs-Dialogfelds für Textdateien, da Sie die Komprimierung von Datentransfer verwenden. Die Lösung ist (in PHP-Code) ......
header('X-Content-Type-Options: nosniff');
Wenn Sie den Inhaltstyp und die Anordnung der Inhalte wie oben beschrieben einstellen, werden mit unterschiedlichen Browsern stark unterschiedliche Ergebnisse erzielt:
IE8: SaveAs-Dialog wie gewünscht und Excel als Standard-App. 100% gut.
Firefox: Der SaveAs-Dialog wird angezeigt, aber Firefox hat keine Ahnung, dass es sich um eine Tabelle handelt. Schlägt vor, es mit Visual Studio zu öffnen! 50% gut
Chrome: Die Hinweise werden vollständig ignoriert. Die CSV-Daten werden im Browser angezeigt. 0% gut.
Natürlich beziehe ich mich in all diesen Fällen auf die Browser, wenn sie aus ihrer Box kommen, ohne dass die Mime-/Anwendungszuordnungen angepasst werden müssen.
Ich schlage vor, ein '/' Zeichen vor 'meinDateiname.cvs' einzufügen.
Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv");
Ich hoffe du bekommst bessere Ergebnisse.
Für C # MVC 4.5 müssen Sie Folgendes tun:
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.