2015-06-18 15 views
6

Io uso XMLHttpRequest per generare Blob dai dati URI utilizzando questo codice:XHR + dati URI non funziona in 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(); 
} 

Usage:

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

Tutto funziona bene in tutti i browser tranne Safari . Genera un tale errore:

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

La domanda è: ci sono dei modi per far funzionare questo approccio in Safari?

+0

Sei riuscito a risolvere questo? Sto affrontando lo stesso identico problema – Michiel

+0

di fronte allo stesso identico problema anche qui. Mi piacerebbe sapere se tu fossi in grado di aggirare questo. –

risposta

-2

Perché dovresti usare un XHR per farlo? Fallo in modo sincrono (risposta presa da 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

Lo so. Ma in modo asincrono è più veloce. Questa non è la domanda qui. – artch

+0

@artch una funzione asincrona ** sarà ** sempre più lenta di una funzione sincrona che fa la stessa cosa. – idbehold

+2

Si prega di non iniziare polemica su questo. Non conosci il nostro caso d'uso esatto, quindi non ha senso. XHR è in grado di utilizzare più core in parallelo su alcuni sistemi, in modo tale che in molti ambienti operativi simultanei è ** molto ** più veloce dell'imprementazione sincrona usando lo stesso singolo processo JS (o persino usando i web worker, poiché hanno messaggio in testa). – artch

Problemi correlati