2010-02-09 9 views
34

Sto lottando con un errore strano. Ho una semplice web app che cattura le cose da un DB e le pubblica come file csv scaricabile. Funziona su firefox e chrome, ma IE non riesce a riconoscerlo come un file CSV (pensando che sia un fl html) e quando faccio clic su Salva ricevo l'errore, "Impossibile scaricare {nome del file} da {nome del sito} . Impossibile aprire questo sito internet ..."Come posso scaricare il file csv su IE? Funziona su firefox

Codice:.

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";  
} 

ho giocato in giro con il tipo di contenuto di un intero gruppo, ma che non ha avuto effetto.

Aggiornamento: Ho provato testo/csv, application/vnd.ms-excel (e variazioni di questo), testo/plain, e alcuni altri che ora dimentico senza fortuna.

Questo è IE8 btw.

Aggiornamento 2: la connessione è su SSL.

+2

Quali altri tipi di contenuti hai provato? Di solito uso 'text/csv' – prodigitalson

risposta

56

Non amiamo IE? :)

Provare a utilizzare queste intestazioni:

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"); 

penso che il tipo di contenuto octet-stream costringe IE per scaricare il file.

+2

Ho trovato le intestazioni minime per FF 3.6 e IE 8 sono: header (" Cache-Control: must-revalidate, post-check = 0, pre-check = 0 "); intestazione ("Content-type: application/octet-stream"); header ("Content-Disposition: attachment; filename = \" ". $ nomefile." \ ""); – Ben

+5

Oh sì IE Lo sto amando

+0

Ah, butta fuori un vecchio plugin di Excel e fai girare il tuo creatore CSV - IE8 barfs su tutto il tuo download. Grazie:] – phatskat

-1

Hai provato il tipo di contenuto: text/csv?

1

Provare a impostare il tipo di contenuto su text/csv anziché su application/octet-stream.

Poiché application/octet-stream è un tipo mime binario generico (e non corrisponde all'estensione '.csv'), Internet Explorer potrebbe ignorarlo e calcolare il tipo mime in base all'estensione del file.

+0

Ho avuto questo in origine, nessuna gioia. –

-1

Qualche tempo fa ho riscontrato un problema con IE6 durante l'apertura di file PDF e l'arresto anomalo del sistema quando AdobeReader 6.0 è stato installato e ho provato ad aprire il file nella finestra del browser. Che ho trovato da qualche parte questa intestazione:

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

Ed è risolto il problema, tutti i file pdf è stato scaricato e aperto in Adobe al posto di IE.

4

Ho avuto successo con il seguente:

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

Impostazione del tipo di applicazione/vnd.ms-excel sembrava fare il trucco nel mio caso. Questo è tutto in un file che viene aperto presentando un modulo utilizzando

target="_blank" 
6

Recentemente abbiamo incontrato questo problema noi stessi. Vedi questo MSKB article

Queste sono le intestazioni che abbiamo dovuto utilizzare per farlo funzionare su 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

Ho provato diverse di queste e varie combinazioni. Usare RegEdit ha fatto il trucco. Grazie! – marklark

+0

Non le intestazioni multiple di Cache-Control causano l'invio della seconda intestazione? – Ross

4

L'unico codice aggiuntivo ho dovuto aggiungere per IE per lavorare con SSL è stato: header("Pragma: public"); Quindi le mie intestazioni simile a questa società:

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

intestazione ("Pragma: pubblico"); ha funzionato bene anche per me con ssl. Grazie –

-1

Questo semplicemente non ha senso.Ho provato la risposta accettata, tutte le altre risposte qui, e non ha funzionato per me. Ho provato le loro permutazioni, e in qualche modo sono riuscito a farlo funzionare in IE in questo modo:

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 che ho fatto è quello di svuotare la cache ogni volta che eccita ho testare il codice. E non ha ancora senso. Nel caso in cui qualcuno potrebbe aver bisogno di questo disperatamente;)

+0

Penso che dovrebbe essere "application/vnd.ms-excel". eccellere con una "L" – Dave

+0

A seconda della piattaforma dell'utente finale, "Content-Type: application/vnd.ms-exce" non funzionerà su client Mac e Linux. Finché i visitatori della tua pagina eseguono tutti Windows, tutto ok. –

2

Abbiamo appena avuto lo stesso problema e dopo aver aggiunto molte intestazioni e ottenere un collegamento funzionante li ho quindi rimossi uno per uno e ho trovato il tasto uno per noi era "Cache- controllo: pubblica" così alla fine abbiamo appena avuto

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

che funzionava bene.

+0

Mi hai appena salvato ore di lavoro! Grazie mille! – toon81

0

La soluzione per me è stato:

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

Se si sta cercando di realizzare questo compito (ottenendo un file CSV per scaricare in IE8) utilizzando Salesforce.com (nel qual caso il vostro front- finale è Visualforce e non è possibile impostare tutte le intestazioni, solo alcuni di essi), ecco quello che vi serve:

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

i pezzi chiave sono cache=true, che, in con incrocio con l'attributo di default expires=0, realizza le seguenti intestazioni:

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

e poi la contentType di application/octet-stream --- fare text/csv fallisce per IE8.

-1

Dopo aver utilizzato Javascript risolverà il problema.

Utilizzare questo per IE,

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

Per ulteriori informazioni ho scritto tutorial su questo, See - Download JSON data in CSV format Cross Browser Support

Spero che questo sarà utile per voi.

Problemi correlati