2011-08-31 8 views
6

Sto cercando di recuperare i dati di un'immagine in Javascript utilizzando XMLHttpRequest.Download di dati binari tramite XMLHttpRequest, senza overrideMimeType

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://www.celticfc.net/images/doc/celticcrest.png"); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState === 4) { 
     var resp = xhr.responseText; 
     console.log(resp.charCodeAt(0) & 0xff); 
    } 
}; 
xhr.send(); 

Il primo byte di dati dovrebbe essere 0x89, tuttavia i byte alto valore restituito come 0xfffd (0xfffd & 0xff essendo 0xfd).

Domande come this one offrono soluzioni utilizzando la funzione overrideMimeType(), tuttavia questo non è supportato sulla piattaforma che sto usando (Qt/QML).

Come posso scaricare i dati correttamente?

+1

Hai provato a utilizzare la codifica base64? – cvsguimaraes

+0

Come potrei provare? – funkybro

+0

Sembra che questo non sia possibile; Lo scaricherò in modo nativo usando invece Qt/C++. – funkybro

risposta

5

Google I/O 2011: HTML5 Showcase for Web Developers: The Wow and the How

Fetch file binario: hotness nuovo

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'http://www.celticfc.net/images/doc/celticcrest.png', true); 

xhr.responseType = 'arraybuffer'; 

xhr.onload = function(e) { 
    if (this.status == 200) { 
     var uInt8Array = new Uint8Array(this.response); // Note:not xhr.responseText 

     for (var i = 0, len = uInt8Array.length; i < len; ++i) { 
      uInt8Array[i] = this.response[i]; 
     } 

     var byte3 = uInt8Array[4]; // byte at offset 4 
    } 
} 

xhr.send(); 
+3

Non funziona per me, 'xhr.response' non è definito. – funkybro

+0

Mi piacerebbe offrirti una birra gratis per la pubblicazione di questo link –

+0

Nota per i futuri lettori: se usi l'arraybuffer come responseType, chrome NON imposterà l'attributo xhr.response per gli eventi onprogress. Quindi questo appraoch è inutile per il download/upload progressivo sotto chrome. – yms

0

Io non sono familiarizzato con Qt, ma ho trovato questo nella loro documentation

string Qt::btoa (data) 
Binary to ASCII - this function returns a base64 encoding of data. 

Quindi, se la vostra immagine è un png puoi provare:

resp = "data:image/png;base64," + btoa(resp); 
document.write("<img src=\""+resp+"\">"); 
+0

Non sono sicuro di come funzionerà se non riesco ad accedere ai valori di byte corretti attraverso la stringa per iniziare. – funkybro

+0

Basta iniziare da 0! I motori di layout ignorano sempre ciò che non è rilevante per ridimensionare le immagini. – cvsguimaraes

Problemi correlati