¿Qué ArrayBufferView?

Estoy recuperando un ArrayBuffer sobre XHR y quiero savelo en la API de FileSystem usando un FileWriter. El FileWriter espera una Blob y el constructor de Blob no tomará un ArrayBuffer, necesita una ArrayBufferView.

Hay muchos ArrayBufferViews para elegir, ¿cómo sé cuál es el correcto para usar?

En MDN , puede encontrar una descripción general de todas las subclasss ArrayBufferView disponibles:

 Type | Size | Description | Equivalent C type -------------+------+---------------------------------------+------------------ Int8Array | 1 | 8-bit twos complement signed integer | signed char Uint8Array | 1 | 8-bit unsigned integer | unsigned char Int16Array | 2 | 16-bit twos complement signed integer | short Uint16Array | 2 | 16-bit unsigned integer | unsigned short Int32Array | 4 | 32-bit twos complement signed integer | int Uint32Array | 4 | 32-bit unsigned integer | unsigned int Float32Array | 4 | 32-bit IEEE floating point number | float Float64Array | 8 | 64-bit IEEE floating point number | double 

Básicamente, esto enumera los espacios de memory que ocuparía cada elemento de la matriz y si es un número simple o un número FP. No estoy seguro de los idiomas con los que está familiarizado, pero si también cubre Java, básicamente es la misma opción que haría en byte[] , short[] , int[] , float[] y double[] (Java siempre está firmado, por lo que esa parte no importa).

Sabemos que los datos binarys, como las imágenes, generalmente se representan como una matriz de bytes. Una matriz corta / int / larga también puede, pero esto es un desperdicio de espacio de memory. Si almacenara una image de 100 KB (tenga en count que "B" representa byte, que es de 8 bits) en una matriz int en lugar de una matriz de bytes, ocuparía 400 KB de memory, lo que supone un desperdicio de 300 KB. Así que el más pequeño, Int8Array , ya sería suficiente con respecto al espacio de memory. Si alguna vez desea atravesarlo programáticamente, lo cual es muy poco probable en este caso, como una matriz sin signo, puede optar por Uint8Array lugar de que cada elemento tenga valores de 0 a 255 lugar de valores de -128 a 127 .

Aquí hay un ejemplo de patada improvisada que descarga un file de image del server, lo guarda en el espacio de almacenamiento local temporal y lo presenta como un <img> en el cuerpo (se requiere poco jQuery para esa parte) . Este ejemplo asume que el file image.png está ubicado en la misma carpeta base que el file JS (o HTML, en caso de que JS esté en línea) se haya descargado desde:

 window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; window.requestFileSystem(window.TEMPORARY, 1024*1024, startDownload, errorHandler); var errorHandler = function(error) { console.log('FS error: ' + error); } var xhr = new XMLHttpRequest(); xhr.open('GET', 'image.png', true); xhr.responseType = 'arraybuffer'; function startDownload(fileSystem) { xhr.onload = function(event) { var content = new Int8Array(this.response); fileSystem.root.getFile('/image.png', { 'create': true }, function(fileEntry) { fileEntry.createWriter(function(fileWriter) { fileWriter.onwriteend = function(event) { $('body').append('<p>Image successfully downloaded:</p>') .append('<p><img src="' + fileEntry.toURL() + '"/></p>'); }; var blob = new Blob([content], { type: 'image/png' }); fileWriter.write(blob); }, errorHandler); }); } xhr.send(); } 

Tenga en count que, a partir del estado actual , esto solo funciona en Chrome.