2011-08-31 24 views
6

Estoy tratando de recuperar los datos de una imagen en Javascript usando XMLHttpRequest.Descargando datos binarios usando XMLHttpRequest, sin 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(); 

El primer byte de estos datos debe ser 0x89, sin embargo ningún bytes de alto valor de retorno como 0xfffd (0xfffd & 0xff ser 0xfd).

Las preguntas como this one ofrecen soluciones usando la función overrideMimeType(), sin embargo, esto no es compatible con la plataforma que estoy usando (Qt/QML).

¿Cómo puedo descargar los datos correctamente?

+1

¿Intentaste utilizar la codificación base64? – cvsguimaraes

+0

¿Cómo probaría eso? – funkybro

+0

Parece que esto no es posible; Lo descargaré de forma nativa usando Qt/C++ en su lugar. – funkybro

Respuesta

5

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

Fetch archivo binario: nueva picor

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

No funciona para mí, 'xhr.response' no está definido. – funkybro

+0

Me gustaría ofrecerle una cerveza gratis para publicar ese enlace –

+0

Observación para futuros lectores: si utiliza arraybuffer como responseType, cromo NO establecerá el atributo xhr.response para eventos onprogress. Entonces este appraoch es inútil para la descarga/carga progresiva bajo chrome. – yms

0

No estoy familiarizado con Qt pero he encontrado esto en su documentation

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

Por lo tanto, si su imagen es un PNG que puedes probar:

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

No estoy seguro de cómo funcionará si no puedo acceder a los valores de bytes correctos a través de la cadena para comenzar. – funkybro

+0

¡Simplemente empieza desde 0! Los motores de diseño siempre ignoran lo que no es relevante para reescalar imágenes. – cvsguimaraes