2009-04-07 5 views
7

Sto cercando altre riflessioni sul modo migliore per avviare un download di file da Javascript.Iniziare un download di file che funziona bene, anche in IE?

Best way to initiate a download? ha un sacco di buone idee, che possono essere riassunti:

  • Impostare lo src in un iframe
  • Usa window.location.replace()
  • Utilizzare una pagina con un colpo di testa meta refresh
  • Utilizzare un window.open()
  • Lasciate che il file direttamente output del server, l'impostazione del Content-Type e Content-Disposition

Tutti questi approcci funzionano bene per i browser con cui ho eseguito il test, ad eccezione di IE8. Con IE8, ho un sacco di problemi:

  • L'IFRAME non funziona a causa di cookie impostati dall'ambiente che sto utilizzando. Penso che avrei bisogno di abilitare le intestazioni P3P per risolvere questo problema, ma l'ambiente non mi consente di impostare le intestazioni, quindi P3P è fuori
  • Il window.location.replace() funziona tranne che in IE8, il la barra degli indirizzi della finestra cambia all'URL del file e la finestra sottostante è vuota dopo l'apertura del file scaricato
  • L'approccio di meta refresh funziona anche, ma la barra degli indirizzi cambia l'URL del file e il la finestra sottostante è vuota dopo il download del file
  • Sto disperatamente cercando di evitare window.open() a schivare qualsiasi blocco popup ker problemi
  • L'ambiente del server sono in non vi permetterà di emettere il file stesso, come si potrebbe fare nel dire, oggetto Response di ASP.NET

non ho nemmeno provato questi metodi con IE6 o IE7, quindi potrebbero esserci altre sorprese lì.

Così chiunque ha altri suggerimenti per avviare un download in IE, dove (1) non sono presenti popup e (2) il file può essere salvato o aperto e (3) non viene lasciata alcuna finestra vuota, (3) usando solo Javascript, HTML e un URL per un file?

Denver Mike

+0

Potresti elaborare l'ambiente del server? –

+0

Ciao Joel, Questo è in fase di esecuzione per l'esecuzione sui server Salesforce.com - hanno il proprio linguaggio di programmazione chiamato Apex. –

risposta

5

Il modello usuale per una pagina di download-file (se è necessario disporre di uno, personalmente li odio) è uno:

<script type="text/javascript"> 
    window.onload= function() { 
     window.location= document.getElementById('downloadlink').href; 
    } 
</script> 
<p> 
    Your download will begin shortly. If it doesn't, 
    <a id="downloadlink" href="file.zip">click here</a>. 
</p> 

o lo stesso con un meta refresh invece della sceneggiatura. In entrambi i casi dovrebbe comportarsi più o meno lo stesso.

L'approccio meta refresh funziona anche, ma ancora la barra degli indirizzi diventa l'URL del file e la finestra sottostante è vuota dopo che il file download

che non dovrebbero accadere. Esiste una versione online che può essere testata? Normalmente, quando il browser viene trasferito a un download di file diretto con qualsiasi metodo normale (link click, location.href, meta-refresh), dovrebbe mantenere la pagina precedente sullo schermo.

l'ambiente non mi permette di impostare le intestazioni, quindi P3P è fuori

Non vi dovrete usare intestazioni per impostare i criteri P3P, un collegamento HTML <> tag funziona altrettanto bene :

<link rel="P3Pv1" href="/policy.p3p" /> 

Ma perché dovresti? Se l'URL di destinazione sta solo servendo un file, non è necessario impostare un cookie, quindi perché preoccuparsi di P3P?

Sto disperatamente cercando di evitare window.open() per schivare eventuali problemi di popup blocker

Se window.open() in risposta ad un utente clic, non ci sono popup problemi di blocco.

Non è necessario aprire un popup per scaricare comunque un file. Sto iniziando a pensare che ci sia qualcosa di molto strano nella destinazione del download di file a cui stai collegando - come se non fosse un download di file, ma una specie di app web HTML dispari. Il collegamento a un download non è difficile, basta collegarlo al file, lavoro fatto; sembra che tu stia rendendo questo molto più difficile di quanto lo sia intrinsicamente.

L'unico problema normale con il semplice collegamento a un file è che se contiene testo, HTML, XML o un'immagine, il browser lo visualizzerà in linea anziché scaricarlo. L'unico modo per sconfiggerlo è usare l'intestazione "Content-Disposition: attachment", servendola attraverso uno script che imposta questa intestazione, o configurando il tuo web server per inviare quell'intestazione per tutti i download di file. Se non è possibile eseguire alcuna di queste nel proprio ambiente server, non esiste alcuna soluzione.

+0

Grazie mille per i vostri commenti dettagliati e ottimi consigli. Ho deciso di fornire semplicemente un collegamento per scaricare il file e funziona perfettamente su tutti i browser ed evita tutte queste complicazioni. –