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";
balaweblog
quelle

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.

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

Der MIME-Typ der CSV ist Text / CSV gemäß RFC 4180 .

Sastanin
quelle
62

Verwendung text/csvals Inhaltstyp.

ibz
quelle
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");
gefährlich
quelle
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 ...

Diclophis
quelle
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();
GateKiller
quelle
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");
}
Rob Church
quelle
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');
Wookie
quelle
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.


quelle
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.

Jaider
quelle
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.
Suresh Kamrushi
quelle