2015-06-07 11 views
34

Ho un problema strano, la funzione di seguito è una che ho creato in base a ciò che ho trovato in rete sulla creazione di un Blob nel client al volo con alcuni binari dati in (passati come array) e in grado di scaricarli. Funziona brillantemente in Chrome, ma non fa nulla in Firefox - A MENO CHE ho il debug e passo attraverso il codice. Sì, stranamente, se creo un punto di interruzione all'interno della funzione e lo passo attraverso, a.click() farà apparire la finestra di download!Il download di Blob createObjectURL non funziona in Firefox (ma funziona quando si esegue il debug)

function downloadFile(filename, data) { 

    var a = document.createElement('a'); 
    a.style = "display: none"; 
    var blob = new Blob(data, {type: "application/octet-stream"}); 
    var url = window.URL.createObjectURL(blob); 
    a.href = url; 
    a.download = filename; 
    document.body.appendChild(a); 
    a.click(); 
    document.body.removeChild(a); 
    window.URL.revokeObjectURL(url);  
} 

Qualcuno può aiutarmi? Questo è stato testato utilizzando Firefox 38.0.5.

+8

un po 'strano quella chiamata a 'document.body.appendChild (a);' è necessaria per Firefox. –

+0

Possibile duplicato di http://stackoverflow.com/questions/37817591/unable-to-download-pdf-blob-url-on-safari/43898188#43898188 – andreasonny83

risposta

57

Probabilmente stai rimuovendo la risorsa troppo presto, provare a ritardarla

... 
    a.click(); 
    setTimeout(function(){ 
     document.body.removeChild(a); 
     window.URL.revokeObjectURL(url); 
    }, 100); 
} 
+1

Wow - sì, sì, ha funzionato meravigliosamente! Grazie! – Johncl

+0

Si è verificato un problema simile con un URL oggetto blob creato in un worker che è stato revocato implicitamente dopo la chiusura del worker. La tua risposta mi ha fatto prendere la strada giusta, aggiungendo un timeout prima di chiudere il Worker, risolvendolo ... grazie! – meyertee

+3

Volevo solo notare che il ritardo '0' funziona altrettanto bene da quello che posso dire - Firefox ha solo bisogno di un suggerimento che qualunque cosa tu stia facendo possa andare alla fine dello stack di chiamate, la durata effettiva sembra essere irrilevante. –

1

questa soluzione funziona per me in bot Chrome e Firefox per l'elemento di ancoraggio esistenti per scaricare il file binario

window.URL = window.URL || window.webkitURL; 

var blob = new Blob([new Uint8Array(binStream)], {type: "octet/stream"}); 

var link = document.getElementById("link"); 
link.href = window.URL.createObjectURL(blob); 
Problemi correlati