2010-02-09 13 views
34

Estoy luchando con un error extraño. Tengo una aplicación web simple que toma cosas de un DB y luego las emite como un archivo descargable csv. Funciona en Firefox y Chrome, pero IE no lo reconoce como un archivo csv (pensando que es un archivo html) y cuando hago clic en guardar aparece el error "No se puede descargar {nombre del archivo} de {nombre del sitio} . no se puede abrir este sitio de Internet ..."¿Cómo puedo obtener un archivo csv para descargar en IE? Funciona en firefox

Código:.

session_start(); 

//some logic goes here... 

//generate csv header 
header("Content-type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=exportevent.csv"); 
header("Pragma: no-cache"); 
header("Expires: 0"); 

echo "Event: " . $event_title . "\n"; 

//print the column names 
echo "Last Name, First Name, Company \n"; 

while($row = mysql_fetch_assoc($result)) 
{ 
    echo $row['atlname'] . ',' . $row['atfname'] . ',' . $row['atcompany'] . "\n";  
} 

he jugado un poco con el tipo de contenido a un montón, pero que no tuvo ningún efecto.

Actualización: He intentado con text/csv, application/vnd.ms-excel (y variaciones de esto), text/plain, y algunos otros que ahora olvido sin suerte.

Esto es IE8 por cierto.

Actualización 2: La conexión ha finalizado en SSL.

+2

¿Qué otros tipos de contenido has probado? Normalmente utilizo 'text/csv' – prodigitalson

Respuesta

56

¿No nos encanta IE? :)

Trate de usar los encabezados:

header("Pragma: public"); 
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); 
    header("Content-Type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=\"exportevent.csv\";"); 
    header("Content-Transfer-Encoding: binary"); 

creo que el tipo de contenido octava-IE obliga a descargar el archivo.

+2

He encontrado los encabezados mínimos para FF 3.6 e IE 8 son: header (" Cache-Control: must-revalidate, post-check = 0, pre-check = 0 "); encabezado ("Content-type: application/octet-stream"); header ("Content-Disposition: attachment; filename = \" ". $ filename." \ ""); – Ben

+5

Oh sí, IE Me encanta

+0

Ah, tira un viejo plugin de Excel y haz rodar tu propio creador de CSV - IE8 barfs en toda tu descarga. Gracias:] – phatskat

-1

¿Has probado el tipo de contenido: text/csv?

1

Intente configurar su tipo de contenido en text/csv en lugar de application/octet-stream.

Dado que la aplicación/octet-stream es un tipo de mime binario genérico (y no coincide con la extensión '.csv'), Internet Explorer podría ignorarlo y calcular el tipo de mime según la extensión del archivo.

+0

Tuve esto originalmente, sin alegría. –

-1

Hace algún tiempo tuve un problema con IE6 al abrir archivos PDF, y se bloqueó cuando AdobeReader 6.0 se instaló e intenté abrir el archivo en la ventana del navegador. Que he encontrado en alguna parte esta cabecera:

header('Content-Type: application/force-download'); 

Y es resuelto el problema, todos los archivos PDF se descargó y se abrió en Adobe en lugar de IE.

4

he tenido éxito con lo siguiente:

header("Content-type: application/vnd.ms-excel"); 
header("Content-disposition: attachment; filename=File.csv"); 

Ajuste del tipo de aplicación/vnd.ms-excel parecía hacer el truco en mi caso. Todo esto está en un archivo que se abre al enviar un formulario usando

target="_blank" 
6

Recientemente nos encontramos con este problema. Ver esto MSKB article

Estos son los encabezados que terminamos teniendo que usar para que funcione a través de SSL.

header("Expires: Sat, 01 Jan 2000 00:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=\"$file_name\";"); 
header("Content-length: " . strlen($csv_string)); 
+0

Intenté varias de estas y varias combinaciones. Usar RegEdit hizo el truco. ¡Gracias! – marklark

+0

¿Los múltiples encabezados de Cache-Control no hacen que solo se envíe el segundo encabezado? – Ross

4

El único código extra que tenía que añadir para IE para trabajar con SSL fue: header("Pragma: public"); Así que mis cabeceras tener este aspecto ahora:

header("Pragma: public"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=some_filename.csv"); 
+0

encabezado ("Pragma: public"); funcionó bien para mí también con ssl. Gracias –

-1

Esto simplemente no tiene sentido.Probé la respuesta aceptada, todas las otras respuestas aquí, y no funcionó para mí. Probé sus permutaciones, y de alguna manera me las arreglé para hacer que funcione en IE, así:

header("Pragma: public"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 
header("Content-Type: application/vnd.ms-exce"); 
header("Content-Disposition: attachment; filename=coupons.csv"); 
header("Content-Transfer-Encoding: binary");  
header("Content-Length: " . strlen($csv)); 
echo $csv; 
die(); 

Una cosa que es vaciar la caché cada vez que me maldita probar el código. Y todavía no tiene sentido. En caso de que alguien lo necesite desesperadamente;)

+0

Creo que debería ser "application/vnd.ms-excel". excel con una "L" – Dave

+0

Dependiendo de la plataforma del usuario final, "Content-Type: application/vnd.ms-exce" no funcionará en clientes Mac y Linux. Siempre y cuando todos los visitantes de su página ejecuten Windows, está bien. –

2

Acabamos de tener el mismo problema y después de agregar muchos encabezados y obtener un enlace de trabajo, los eliminé uno por uno y encontré que la clave para nosotros era "Caché- Control: público" así que al final acabamos de tener

header("Cache-Control: public"); 
header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=some_filename.csv"); 

que funcionaba bien.

+0

¡Me acabas de ahorrar horas de trabajo! Muchas gracias! – toon81

0

La solución para mí fue:

header_remove(); 
header('Content-Type: text/csv'); 
header('Content-Disposition: attachment; filename=brokerlist.csv'); 
echo $content; 
-2

Si usted está tratando de lograr esta tarea (que consigue un archivo CSV para descargar en IE8) utilizando Salesforce.com (en cuyo caso su delantero final es Visualforce y no se puede establecer todas las cabeceras, sólo algunos de ellos), esto es lo que necesita:

<apex:page cache="true" 
     contentType="application/octet-stream#myAwesomeFileName.csv" 
     showHeader="false" sidebar="false" standardStylesheets="false"> 
    <apex:outputText value="{!csvContent}" escape="false"/> 
</apex:page> 

las piezas clave son cache=true, que, en con cruce con el atributo predeterminado expires=0, logra los siguientes encabezados:

header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: public"); 

y luego el contentType de application/octet-stream --- haciendo text/csv falla para IE8.

-1

Después de usar el Javascript, resuelve el problema.

Use este para IE,

var IEwindow = window.open(); 
    IEwindow.document.write('sep=,\r\n' + CSV); 
    IEwindow.document.close(); 
    IEwindow.document.execCommand('SaveAs', true, fileName + ".csv"); 
    IEwindow.close(); 

Para obtener más información que he escrito tutorial sobre eso, See - Download JSON data in CSV format Cross Browser Support

Esperamos que esto sea útil para usted.

Cuestiones relacionadas