Risposta Tipo di contenuto come CSV


328

Devo inviare un file CSV in risposta HTTP. Come posso impostare la risposta di output come formato CSV?

Questo non funziona:

Response.ContentType = "application/CSV";

Risposte:


491

L'utilizzo text/csvè il tipo più appropriato.

Dovresti anche considerare di aggiungere Content-Dispositionun'intestazione alla risposta. Spesso un testo / CSV viene caricato da un Internet Explorer direttamente in un'istanza ospitata di Excel. Questo può o meno essere un risultato desiderabile.

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

Quanto sopra farà apparire una finestra di dialogo "Salva con nome" che potrebbe essere ciò che intendi.


2
Mi piace usare un oggetto System.Net.Mime.ContentDisposition per creare quella stringa.
Ronnie Overby l'


62

Utilizzare text/csvcome tipo di contenuto.


48

Nel corso degli anni ho perfezionato un set perfetto di intestazioni per questo che funzionano perfettamente in tutti i browser che conosco

// 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
Se usi application / vnd.ms-excel. Su osx safari aggiunge un'estensione di file ".xls"
Luke Smith

28

Prova uno di questi altri tipi mime (da qui: http://filext.com/file-extension/CSV )

  • testo / valori separati da virgole
  • text / csv
  • application / csv
  • application / excel
  • application / vnd.ms-excel
  • application / vnd.msexcel

Inoltre, il tipo mime potrebbe fare distinzione tra maiuscole e minuscole ...


15

Usa solo così

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

Racchiudere il nome del file tra virgolette per me risolto quando il client è Firefox.
Graham,

1
Se lo stai utilizzando in un controller MVC, dovrai terminare il metodo controller return new EmptyResult()per ottenere il nome file da incollare. Altrimenti IE proverà a salvare il file come ActionName.htm.
3Daveva il

5

In ASP.net MVC, è possibile utilizzare ae FileContentResultil Filemetodo:

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

3

Ho scoperto che il problema con IE è che annusa i dati di ritorno e prende una decisione su quale tipo di contenuto pensa di essere stato inviato. Ci sono una serie di effetti collaterali che ciò provoca, come ad esempio l'apertura di una finestra di dialogo saveAs per i file di testo perché si utilizza la compressione dei trasferimenti di dati. La soluzione è (in codice php) ......

header('X-Content-Type-Options: nosniff');

2

L'impostazione del tipo di contenuto e della disposizione del contenuto come descritto sopra produce risultati molto diversi con diversi browser:

IE8: Salva come finestra di dialogo desiderata ed Excel come app predefinita. 100% buono.

Firefox: viene visualizzata la finestra di dialogo Salva come As, ma Firefox non ha idea che sia un foglio di calcolo. Suggerisce di aprirlo con Visual Studio! 50% buono

Chrome: i suggerimenti vengono completamente ignorati. I dati CSV sono mostrati nel browser. 0% buono.

Ovviamente in tutti questi casi mi riferisco ai browser appena escono dalla loro scatola, senza personalizzazione dei mapping mime / application.


Se Firefox vuole che tu apra con Visual Studio, significa che stai esportando l'HTML e non un CSV.
Martin,

Questo non sembra essere il caso nel 2014, ha funzionato bene in tutti loro per me.
MikeKulls,

Definisci "come descritto sopra"
xhienne

2

Suggerisco di inserire un carattere '/' davanti a 'myfilename.cvs'

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

Spero che tu ottenga risultati migliori.


0

Per C # MVC 4.5 devi fare così:

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.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.