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";
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:
L'utilizzo text/csv
è il tipo più appropriato.
Dovresti anche considerare di aggiungere Content-Disposition
un'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.
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");
Prova uno di questi altri tipi mime (da qui: http://filext.com/file-extension/CSV )
Inoltre, il tipo mime potrebbe fare distinzione tra maiuscole e minuscole ...
Usa solo così
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
return new EmptyResult()
per ottenere il nome file da incollare. Altrimenti IE proverà a salvare il file come ActionName.htm
.
In ASP.net MVC, è possibile utilizzare ae FileContentResult
il File
metodo:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
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');
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.
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.