2013-01-13 8 views
15

Sto recuperando un ArrayBuffer su XHR e voglio salvarlo sull'API FileSystem utilizzando un FileWriter. FileWriter si aspetta un Blob e il costruttore Blob non accetta un ArrayBuffer, richiede un ArrayBufferView.Which ArrayBufferView

Ci sono molte ArrayBufferViews tra cui scegliere, come faccio a sapere qual è il corretto da usare?

+0

Che dire dell'utilizzo di JSON? –

risposta

14

A MDN, è possibile trovare una panoramica di tutti ArrayBufferView sottoclassi disponibili:

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 

Fondamentalmente, questo elenca spazi ciò che la memoria ogni elemento dell'array occupare e se si tratta di un semplice numero o un numero FP. Non sono sicuro di quali lingue hai familiarità, ma se riguarda anche Java, è fondamentalmente la stessa scelta che faresti su byte[], short[], int[], float[] e double[] (Java è sempre firmato, in modo che parte non importa).

Sappiamo che le immagini di tipo binario vengono solitamente rappresentate come una matrice di byte. Un array breve/int/lungo può anche, ma questo è uno spreco di spazio di memoria. Se si memorizzasse un'immagine da 100 KB (si noti che "B" sta per byte, ovvero 8 bit) in un array int invece che in un array di byte, quindi occuperebbe 400 KB di memoria, ovvero uno spreco di 300 KB. Quindi il più piccolo, Int8Array, sarebbe già sufficiente per quanto riguarda lo spazio di memoria. Se desideri mai piace attraversare programmazione che — che è molto improbabile che in questo caso — come un array senza segno, allora si può optare per il Uint8Array invece in cui ogni elemento contiene valori 0-255 invece di valori -128 a 127.

Ecco un esempio di kickoff cancellabile e non copiabile che scarica un file di immagine dal server, lo salva nello spazio di archiviazione locale temporaneo e lo presenta come un <img> nel corpo (è richiesta una piccola quantità di jQuery parte). Questo esempio presuppone che il file image.png si trova nella stessa cartella di base come il JS (o HTML, nel caso in cui JS è inline) file stato scaricato da:

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(); 
} 

nota, come dello stato current, questo funziona solo in Chrome.

Problemi correlati