2015-06-18 13 views
6

używam XMLHttpRequest wygenerować Blob z URI danych przy użyciu tego kodu:XHR + dane URI nie działa w Safari

function dataUrlToBlob(dataUrl, callback) { 
    var xhr = new XMLHttpRequest; 
    xhr.open('GET', dataUrl); 
    xhr.responseType = 'arraybuffer'; 
    xhr.onload = function(e) { 
     callback(new Blob([this.response], {type: 'image/png'})); 
    }; 
    xhr.send(); 
} 

Zastosowanie:

dataUrlToBlob('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII=', callback); 

Wszystko działa poprawnie w każdej przeglądarce z wyjątkiem Safari . Wystąpił taki błąd:

[Error] XMLHttpRequest cannot load data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQIW2NkAAIAAAoAAggA9GkAAAAASUVORK5CYII=. Cross origin requests are only supported for HTTP.

Pytanie brzmi, czy są jakieś sposoby, aby to podejście działało w Safari?

+0

Udało ci się to rozwiązać? Mam dokładnie ten sam problem. – Michiel

+0

Wobec tego samego problemu. Chciałbym wiedzieć, czy byłeś w stanie to obejść. –

Odpowiedz

-2

Dlaczego chcesz użyć XHR, aby to zrobić? Po prostu zrób to synchronicznie (odpowiedź z here):

function dataURItoBlob(dataURI) { 
    if(typeof dataURI !== 'string'){ 
     throw new Error('Invalid argument: dataURI must be a string'); 
    } 
    dataURI = dataURI.split(','); 
    var type = dataURI[0].split(':')[1].split(';')[0], 
     byteString = atob(dataURI[1]), 
     byteStringLength = byteString.length, 
     arrayBuffer = new ArrayBuffer(byteStringLength), 
     intArray = new Uint8Array(arrayBuffer); 
    for (var i = 0; i < byteStringLength; i++) { 
     intArray[i] = byteString.charCodeAt(i); 
    } 
    return new Blob([intArray], { 
     type: type 
    }); 
} 
+0

Wiem o tym. Ale asynchronicznie jest szybszy. To nie jest tutaj pytanie. – artch

+0

@artch funkcja asynchroniczna ** zawsze ** będzie wolniejsza niż funkcja synchroniczna, robiąc to samo. – idbehold

+2

Proszę nie rozpoczynać polemiki na ten temat. Nie znasz naszego dokładnego przypadku użycia, więc jest to po prostu pozbawione sensu. XHR jest w stanie korzystać z wielu rdzeni równolegle w niektórych systemach, tak więc w wielu współbieżnych operacjach środowisko jest ** znacznie ** szybsze niż synchroniczne impedowanie przy użyciu tego samego pojedynczego procesu JS (lub nawet przy użyciu robotów sieciowych, ponieważ mają one przesyłanie wiadomości). – artch