2015-06-07 13 views
34

Mam dziwny problem, funkcja poniżej jest taka, którą stworzyłem w oparciu o to, co znalazłem w sieci o tworzeniu Bloba w kliencie w locie z jakimś binarnym dane w (przekazane jako tablica) i możliwość ich pobrania. Działa to znakomicie w Chrome, ale nie robi nic w Firefoksie - JEŚLI nie debuguję i nie przechodzę przez kod. Tak, co dziwne, jeśli utworzę punkt przerwania wewnątrz funkcji i przejdę przez nią, a.click() wyświetli okno pobierania!Blob createObjectURL pobieranie nie działa w Firefoksie (ale działa podczas debugowania)

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

Czy ktoś może mi pomóc? Zostało to przetestowane przy użyciu przeglądarki Firefox 38.0.5.

+8

trochę dziwne to wywołanie funkcji "document.body.appendChild (a);" jest niezbędne w Firefoksie. –

+0

Możliwe duplikaty http://stackoverflow.com/questions/37817591/unable-to-download-pdf-blob-url-on-safari/43898188#43898188 – andreasonny83

Odpowiedz

57

Pewnie usunięcie zasobu zbyt szybko, spróbuj opóźnia to

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

Wow - tak, rzeczywiście, działało to cudownie! Dzięki! – Johncl

+0

Miał podobny problem z adresem URL obiektu Blob utworzonym w module Worker, który został niejawnie odwołany po zamknięciu modułu Worker. Twoja odpowiedź postawiła mnie na właściwej drodze, dodając limit czasu przed zamknięciem pracownika naprawionego ... dzięki! – meyertee

+3

Po prostu chciałem zauważyć, że opóźnienie '0' działa równie dobrze, co mogę powiedzieć - Firefox po prostu potrzebuje podpowiedzi, że cokolwiek robisz, może przejść na koniec stosu wywołań, rzeczywisty czas wydaje się być nieistotny. –

1

to rozwiązanie działa dla mnie w Chrome i Firefox bot do istniejącego elementu zaczepienia, aby pobrać plik binarny

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