Tipo de contenido de respuesta como CSV

328

Necesito enviar un archivo CSV en respuesta HTTP. ¿Cómo puedo configurar la respuesta de salida como formato CSV?

Esto no está funcionando:

Response.ContentType = "application/CSV";
balaweblog
fuente

Respuestas:

491

Usar text/csves el tipo más apropiado.

También debe considerar agregar un Content-Dispositionencabezado a la respuesta. A menudo, un Internet Explorer cargará un texto / csv directamente en una instancia alojada de Excel. Esto puede o no ser un resultado deseable.

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

Lo anterior hará que aparezca un cuadro de diálogo "Guardar como" que puede ser lo que desea.

AnthonyWJones
fuente
2
Me gusta usar un objeto System.Net.Mime.ContentDisposition para construir esa cadena.
Ronnie Overby
151

El tipo MIME del CSV es text / csv según RFC 4180 .

sastanin
fuente
62

Usar text/csvcomo tipo de contenido.

ibz
fuente
48

A lo largo de los años, he estado perfeccionando un conjunto perfecto de encabezados para esto que funcionan de manera brillante en todos los navegadores que conozco

// 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");
peligroso
fuente
77
Si usa application / vnd.ms-excel. En osx safari agrega una extensión de archivo ".xls"
Luke Smith
28

Pruebe uno de estos otros tipos de mime (desde aquí: http://filext.com/file-extension/CSV )

  • texto / valores separados por comas
  • texto / csv
  • aplicación / csv
  • aplicación / excel
  • application / vnd.ms-excel
  • application / vnd.msexcel

Además, el tipo mime puede ser sensible a mayúsculas y minúsculas ...

diclophis
fuente
15

Solo usa así

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
GateKiller
fuente
El encerrar el nombre del archivo entre comillas dobles me solucionó esto cuando el cliente es Firefox.
Graham
1
Si está utilizando esto en un controlador MVC, deberá finalizar el método del controlador return new EmptyResult()para que el nombre de archivo se pegue. De lo contrario, IE intentará guardar el archivo como ActionName.htm.
3Dave
5

En ASP.net MVC, puede usar ay FileContentResultel Filemétodo:

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

He descubierto que el problema con IE es que olfatea los datos devueltos y toma su propia decisión sobre qué tipo de contenido cree que se ha enviado. Hay una serie de efectos secundarios que esto causa, como abrir siempre un cuadro de diálogo guardar como para archivos de texto porque está utilizando la compresión de transferencias de datos. La solución es (en código php) ......

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

Establecer el tipo de contenido y la disposición del contenido como se describió anteriormente produce resultados muy diferentes con diferentes navegadores:

IE8: cuadro de diálogo Guardar como se desee, y Excel como la aplicación predeterminada. 100% bueno

Firefox: aparece el cuadro de diálogo Guardar como, pero Firefox no tiene idea de que es una hoja de cálculo. Sugiere abrirlo con Visual Studio! 50% bueno

Chrome: las sugerencias se ignoran por completo. Los datos CSV se muestran en el navegador. 0% bueno

Por supuesto, en todos estos casos me refiero a los navegadores a medida que salen de su caja, sin personalización de las asignaciones de mime / aplicación.


fuente
Si Firefox quiere que abras con Visual Studio, significa que estás exportando el HTML y no un CSV.
Martin
Este no parece ser el caso en 2014, funcionó bien en todos ellos para mí.
MikeKulls
Defina "como se describió anteriormente"
xhienne
2

Sugiero insertar un carácter '/' delante de 'myfilename.cvs'

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

Espero que obtengas mejores resultados.

Jaider
fuente
0

Para C # MVC 4.5 debe hacer lo siguiente:

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
fuente