2010-01-04 14 views
6

Stavo cercando di implementare un "link per il download" e lo metto accanto a una delle mie tabelle di report in modo che gli utenti possano scaricare un file csv e aprirlo con applicazioni come Excel."download link" non riesce in IE

I record vengono generati dinamicamente in base alla query eseguita dagli utenti.

Quindi, da qualche parte nel mio controller c'è qualcosa di simile:

response.headers['Content-Type'] = 'text/csv' 
response.headers['Content-Disposition'] = 'attachment; filename=xxx.csv' 
return response.stream(dynamically_generated_csv, request=request) 

Questo funziona sia in FireFox & Chrome, ma fallisce in IE.

Quando stampo le intestazioni di risposta, ho scoperto che diverse intestazioni sono stati aggiunti alla mia risposta da web2py: 'Scade', 'Cache-Control', ecc ...

E quando rimuovo il 'Cache -Control' colpo di testa di fare il seguente:

del response.headers['Cache-Control'] 

funziona in IE.

Quindi sembra che IE abbia problemi a gestire un file scaricabile con "Cache-Control" impostato su un determinato valore.

Ora, la mia domanda è:

  • Perché il web2py aggiungere queste intestazioni di risposta, implicitamente? e forse senza un modo di spegnerlo?

  • c'è qualche effetto collaterale quando elimini l'intestazione 'Cache-Control' in questo modo?

Grazie in anticipo.

+2

Questo è un difetto noto in alcune versioni di IE: http://support.microsoft.it/kb/323308 –

+0

Quando stavo usando Django, le intestazioni di risposta sono solo quelle che ho impostato esplicitamente; tuttavia, nel caso di web2py, ha aggiunto le intestazioni di risposta senza la conoscenza degli sviluppatori, quindi penso che forse questo non è un buon progetto per un framework, è costato alle persone il tempo di scoprire cosa sta succedendo sotto il cofano. – satoru

+2

Durante la pubblicazione di file statici, web2py imposta le intestazioni di cache per assicurarsi che il browser non richieda i file che già possiede e non siano stati modificati sul server. Quando serve contenuti dinamici web2py si assicura che il browser non lo memorizzi nella cache (questo è il tuo caso, credo). La filosofia di web2py è diversa da quella di altri framework. Cerca di fare il più possibile per te in modo da non dover imparare howto (in questo caso come gestire la cache del browser). Come è stato sottolineato il problema è un bug di IE. Porterò questo sulla mailing list di web2py e discuterò con altri sviluppatori. – mdipierro

risposta

5

Non sono sicuro di quali siano le intestazioni di controllo della cache inviate, ma IE ha un bug con i file scaricati come si sta verificando.

Per IE, DEVI abilitare la memorizzazione nella cache. Quando IE carica file (ad esempio file Excel), in Excel, li carica dalla directory della cache, quindi se non lo si memorizza nella cache, Excel (o un'altra app) non caricherà il file.

Eric Law (MSFT) sul tema: http://blogs.msdn.com/ieinternals/archive/2009/10/02/Internet-Explorer-cannot-download-over-HTTPS-when-no-cache.aspx

Aggiornamento: Se invece si desidera solo per forzare il download ... per esempio non ho IE caricare il file excel all'interno della finestra di IE ... quindi assicurati di impostare le intestazioni complete per l'allegato.

//PHP style 
header('Content-Type: application/vnd.ms-excel'); 
header('Content-Disposition: attachment; filename="downloaded.pdf"'); 
+0

Thx per la tua spiegazione. Ma penso che questo potrebbe non essere lo stesso problema che ho incontrato. Ho impostato esplicitamente "Content-Disposition" su "attachment" e penso che questo, si spera, impedisca l'apertura del file anche in IE. – satoru

+1

Ancora più problematico delle intestazioni di controllo della cache, e come menzionato nel blog di Eric, è il fatto che le persone attente alla sicurezza amano abilitare l'opzione Internet Explorer "Non salvare pagine crittografate su disco" che non è limitato alla cache ma * totalmente * impedisce di salvare * qualsiasi * file da siti abilitati SSL su disco. Difettoso dal design. – Archimedix

+0

Satoru - ha modificato il lavoro di disposizione dei contenuti? Sto vivendo lo stesso problema al momento. –

0

Questo non risponde alla tua domanda, ma risolve, spero, il problema originale.

Vorrei solo aggiungere timestamp (qualcosa di abbastanza unico) per interrogare la stringa del collegamento al file CSV. Mi ha aiutato.

2

Il collegamento di download è https (ssl)? Se è così, allora IE non può gestire il download se è impostato per essere memorizzato nella cache. Questo è un problema noto con IE.

+0

No, uso solo HTTP semplice. – satoru

Problemi correlati