Ich muss eine CSV-Datei in HTTP-Antwort senden. Wie kann ich die Ausgabeantwort als CSV-Format festlegen?
Das funktioniert nicht:
Response.ContentType = "application/CSV";
Ich muss eine CSV-Datei in HTTP-Antwort senden. Wie kann ich die Ausgabeantwort als CSV-Format festlegen?
Das funktioniert nicht:
Response.ContentType = "application/CSV";
Antworten:
Verwenden text/csv
ist der am besten geeignete Typ.
Sie sollten auch in Betracht ziehen Content-Disposition
, der Antwort einen Header hinzuzufügen . Oft 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");
Das oben Gesagte führt dazu, dass ein Dialogfeld "Speichern unter" angezeigt wird, das möglicherweise Ihren Absichten entspricht.
Im Laufe der Jahre habe ich einen perfekten Satz von Headern dafür entwickelt, die in allen mir bekannten Browsern hervorragend funktionieren
// 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 aus (von hier aus: http://filext.com/file-extension/CSV )
Der MIME-Typ kann auch zwischen Groß- und Kleinschreibung unterscheiden ...
text/csv
arbeitete für mich
Verwenden Sie einfach so
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
return new EmptyResult()
, damit der Dateiname erhalten bleibt. Andernfalls versucht der IE, die Datei als zu speichern ActionName.htm
.
In ASP.net MVC können Sie a FileContentResult
und die folgende File
Methode verwenden:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
Ich habe festgestellt, dass das Problem mit dem Internet Explorer darin besteht, dass er die Rückgabedaten abruft und sich selbst ein Bild davon macht, welcher Inhaltstyp seiner Meinung nach gesendet wurde. Dies hat eine Reihe von Nebenwirkungen zur Folge, z. B. das Öffnen eines saveAs-Dialogfelds für Textdateien, da Sie die Komprimierung von Datenübertragungen verwenden. Die Lösung ist (im PHP-Code) ......
header('X-Content-Type-Options: nosniff');
Wenn Sie den Inhaltstyp und die Inhaltsdisposition wie oben beschrieben einstellen, werden mit verschiedenen Browsern sehr unterschiedliche Ergebnisse erzielt:
IE8: Dialogfeld "Speichern unter" wie gewünscht und Excel als Standard-App. 100% gut.
Firefox: Das Dialogfeld "Speichern unter" 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 der Verpackung kommen, ohne dass die MIMM- / Anwendungszuordnungen angepasst werden müssen.
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.