2008-12-26 23 views

Respuesta

418

usando text/csv es el tipo más adecuado.

También debería considerar agregar un encabezado Content-Disposition a la respuesta. A menudo, un Internet/csv será cargado por un Internet Explorer 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 un archivo "Guardar como" de diálogo que aparezca, que puede ser lo que se propone.

+4

Firefox 3.0.10 parece requerir que el valor del encabezado esté en el orden inverso: archivo adjunto; filename = myfilename.csv –

+3

De acuerdo con RFC# 2183 primero es el tipo (archivo adjunto) y luego los parámetros (nombre de archivo, etc.) –

+0

Se corrigió el pedido en el valor del encabezado. –

45

Uso text/csv como el tipo de contenido.

+0

derecho, se debe utilizar texto en lugar de aplicación. – Biswanath

23

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

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

Además, el mimo tipo podría ser sensible a mayúsculas ...

2

Establecimiento del tipo de contenido y la disposición de contenido como se describe anteriormente produce violentamente resultados diversos con diferentes navegadores:

IE8: diálogo como se desee SaveAs, y Excel como la aplicación por defecto. 100% bueno

Firefox: aparece el cuadro de diálogo Guardar como, pero Firefox no tiene idea de que se trata de 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 personalizar las asignaciones de mimo/aplicación.

+0

Si Firefox quiere que abras con Visual Studio, significa que estás exportando el HTML y no un CSV. – Martin

+0

Esto no parece ser el caso en 2014, funcionó bien en todos ellos para mí. – MikeKulls

+0

Defina "como se describió anteriormente" – xhienne

15

sólo tiene que utilizar el estilo

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

No se olvide de response.clear() primero. – Chris

+0

Adjuntar el nombre del archivo entre comillas dobles lo solucioné cuando el cliente sea Firefox. – Graham

+0

Si está utilizando esto en un controlador MVC, tendrá que finalizar el método del controlador con 'return new EmptyResult()' para obtener el nombre del archivo para pegar. De lo contrario, IE intentará guardar el archivo como 'ActionName.htm'. –

46

lo largo de los años que he estado perfeccionando un conjunto perfecto de los encabezados por esto que funciona de manera brillante en todos los navegadores, que yo sepa

// 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"); 
+6

Si usa application/vnd.ms-excel. On osx safari agrega una extensión de archivo ".xls" –

2

sugiero a inserta un carácter '/' delante de 'myfilename.cvs '

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

Espero que consigas mejores resultados.

2

He encontrado que el problema con IE es que olfatea los datos de retorno y toma una decisión sobre qué tipo de contenido cree que ha sido enviado. Hay una serie de efectos colaterales que esto ocasiona, como abrir siempre un cuadro de diálogo guardar como para archivos de texto porque está utilizando la compresión de trasnferidos de datos. La solución es (en código PHP) ......

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

En ASP.net MVC, se puede utilizar un FileContentResult y la File método:

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