2013-01-13 26 views
15

Pobieram ArrayBuffer przez XHR i chcę zapisać go do API FileSystem za pomocą FileWriter. FileWriter oczekuje, że konstruktor Blob i Blob nie weźmie ArrayBuffer, wymaga ArrayBufferView.Który ArrayBufferView

Istnieje wiele ArrayBufferViews do wyboru, skąd mam wiedzieć, który jest prawidłowy w użyciu?

+0

Co z wykorzystaniem JSON? –

Odpowiedz

14

Na MDN można znaleźć przegląd wszystkich dostępnych ArrayBufferView podklasy:

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 

Zasadniczo, można znaleźć miejsca, co pamięć każdy element tablicy zajmie i czy jest to zwykły numer lub numer FP. Nie mam pewności, jakie języki znasz, ale jeśli obejmuje to także język Java, jest to zasadniczo taki sam wybór, jak w przypadku opcji byte[], short[], int[], float[] i double[] (Java jest zawsze podpisana, dzięki czemu część nie ma znaczenia).

Wiemy, dane binarne, takie jak obrazy, są zwykle reprezentowane jako tablica bajtów. Może to być również tablica krótka/int/long, ale jest to marnowanie przestrzeni pamięci. Jeśli chciałbyś zapisać obraz o wielkości 100 KB (zwróć uwagę, że "B" oznacza bajt, czyli 8 bitów) w tablicy int, zamiast tablicy bajtów, wówczas zajmowałby on 400 KB pamięci, co jest marnowaniem 300 KB. Najmniejszy, Int8Array, wystarczyłby już w odniesieniu do przestrzeni pamięci. Gdybyś kiedykolwiek chciał programowo przemierzać go — co jest bardzo mało prawdopodobne w tym przypadku — jako unsigned tablicy, to może zdecydować się na Uint8Array zamiast gdzie każda pozycja posiada wartości 0 do 255 zamiast wartości -128 do 127.

Oto przykład kopiowania i kopiowania, który umożliwia pobranie pliku obrazu z serwera, zapisanie go w tymczasowej lokalnej pamięci i wyświetlenie go jako obiektu <img> w ciele (wymagany jest mały jQuery) część). W tym przykładzie założono, że plik image.png znajduje się w tym samym folderze bazowej jako JS (lub HTML, w przypadku JS jest inlined) plik został pobrany z:

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

Note, jako państwa current to działa tylko w Chrome.