2013-01-13 10 views
15

Ich erhalte einen ArrayBuffer über XHR und möchte es mit einem FileWriter in der FileSystem API speichern. Der FileWriter erwartet einen Blob und der Blob-Konstruktor nimmt keinen ArrayBuffer, sondern eine ArrayBufferView.Welcher ArrayBufferView

Es gibt viele ArrayBufferViews zur Auswahl, woher weiß ich, welche die richtige ist?

+0

Wie wäre es mit JSON? –

Antwort

14

Bei MDN können Sie einen Überblick über alle verfügbaren ArrayBufferView Subklassen finden:

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 

Grundsätzlich ist diese Listen, welche Speicherplätze jedes Element des Arrays besetzen würde und wenn es eine einfache Zahl oder eine FP-Zahl. Ich bin nicht sicher, welche Sprachen Sie kennen, aber wenn es auch Java abdeckt, dann ist es im Grunde die selbe Wahl, wie Sie auf byte[], short[], int[], float[] und double[] machen würden (Java wird immer unterzeichnet, so dass Teil spielt keine Rolle).

Wir wissen, binäre Daten wie Bilder wird in der Regel als Byte-Array dargestellt. Ein short/int/long-Array kann auch, aber das ist eine Verschwendung von Speicherplatz. Wenn Sie ein 100-KB-Bild (beachten Sie, dass "B" für Byte steht, was 8 Bits entspricht) in einem int-Array anstelle eines Byte-Arrays speichern, würde es 400 KB Speicher belegen, was eine Verschwendung von 300 KB bedeutet. Der kleinste, Int8Array, würde also bereits hinsichtlich des Speicherplatzes ausreichen. Wenn Sie schon einmal programmatisch mögen es — durchqueren, die in diesem Fall — als unsigned Array sehr unwahrscheinlich ist, dann können Sie für die Uint8Array stattdessen entscheiden, wo jedes Element Werte 0-255 statt Werte -128 zu 127 hält.

Hier ist ein Copy'n'Paste'n'runnable Kickoff-Beispiel, das eine Image-Datei vom Server herunterlädt, speichert es in den temporären lokalen Speicherplatz und präsentiert es als im Körper (kleine jQuery ist dafür erforderlich Teil). Dieses Beispiel geht davon aus, dass die image.png Datei in der gleichen Basis Ordner wie die JS befindet (oder HTML, bei JS ist inlined) Datei heruntergeladen worden ist:

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

Hinweis, wie der current Zustand, das funktioniert, Nur in Chrome