Antwort Inhaltstyp als CSV


328

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:


491

Verwenden text/csvist 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.


2
Ich verwende gerne ein System.Net.Mime.ContentDisposition-Objekt zum Erstellen dieser Zeichenfolge.
Ronnie Overby



48

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");

7
Wenn Sie application / vnd.ms-excel verwenden. Auf osx safari fügt eine ".xls" Dateierweiterung hinzu
Luke Smith

28

Probieren Sie einen dieser anderen MIME-Typen aus (von hier aus: http://filext.com/file-extension/CSV )

  • Text / durch Kommas getrennte Werte
  • text / csv
  • Anwendung / CSV
  • Anwendung / Excel
  • application / vnd.ms-excel
  • application / vnd.msexcel

Der MIME-Typ kann auch zwischen Groß- und Kleinschreibung unterscheiden ...


text/csvarbeitete für mich
göttlicher

15

Verwenden Sie einfach so

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();

Das Einschließen des Dateinamens in doppelte Anführungszeichen hat dies für mich behoben, wenn der Client Firefox ist.
Graham

1
Wenn Sie dies in einem MVC-Controller verwenden, müssen Sie die Controller-Methode mit beenden return new EmptyResult(), damit der Dateiname erhalten bleibt. Andernfalls versucht der IE, die Datei als zu speichern ActionName.htm.
3Dave

5

In ASP.net MVC können Sie a FileContentResultund die folgende FileMethode verwenden:

public FileContentResult DownloadManifest() {
    byte[] csvData = getCsvData();
    return File(csvData, "text/csv", "filename.csv");
}

3

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');

2

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.


Wenn Firefox möchte, dass Sie mit Visual Studio öffnen, bedeutet dies, dass Sie den HTML-Code und keine CSV-Datei exportieren.
Martin

Dies scheint 2014 nicht der Fall zu sein, es hat in allen für mich gut funktioniert.
MikeKulls

Bitte definieren Sie "wie oben beschrieben"
xhienne

2

Ich schlage vor, ein '/' vor 'myfilename.cvs' einzufügen.

Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv");

Ich hoffe, Sie erzielen bessere Ergebnisse.


0

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.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.