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";
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";
Respuestas:
Usar text/csv
es el tipo más apropiado.
También debe considerar agregar un Content-Disposition
encabezado 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.
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");
Pruebe uno de estos otros tipos de mime (desde aquí: http://filext.com/file-extension/CSV )
Además, el tipo mime puede ser sensible a mayúsculas y minúsculas ...
Solo usa así
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
return new EmptyResult()
para que el nombre de archivo se pegue. De lo contrario, IE intentará guardar el archivo como ActionName.htm
.
En ASP.net MVC, puede usar ay FileContentResult
el File
método:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
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');
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.
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.