2013-01-13 16 views
15

XHR üzerinden bir ArrayBuffer alıyorum ve bir FileWriter kullanarak FileSystem API'ye kaydetmek istiyorum. FileWriter bir Blob ve Blob kurucusunun bir ArrayBuffer almayacağını bekler, bir ArrayBufferView alır.Hangi ArrayBufferView

Seçebileceğiniz birçok ArrayBufferView var, hangisinin doğru olduğunu nasıl bilebilirim?

+0

JSON'u kullanma hakkında ne düşünüyorsunuz? –

cevap

14

MDN kısmında, mevcut tüm ArrayBufferView alt sınıflarından bir bakış bulabilirsiniz:

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 

Temelde, bu dizinin her bir öğesi işgal ne hafıza boşlukları listeler ve düz sayı veya FP numara buysa. Hangi dilleri bildiğinizden emin değilim, ancak Java'yı da kapsamazsa, temelde byte[],, short[], int[], float[] ve double[]'da yaptığınız gibi aynı seçimdir. bölüm önemli değil).

Resimler gibi ikili veriler genellikle bayt dizisi olarak gösterilir. Kısa/uzun/uzun bir dizi de olabilir, ancak bu bir bellek alanı kaybıdır. Bir 100 KB görüntüsünü saklarsanız ("B" nin bayt dizisi yerine bir dizide 8 bit olduğunu gösterir), bu durumda 400 KB'lık bir bellek kaplar, bu da 300 KB'lık bir israftır. Yani en küçük olanı, Int8Array, zaten bellek alanı ile ilgili yeterli olurdu. Hiç programlı o imzasız dizi olarak bu durumda — çok olası değildir — çapraz isterseniz her öğe 0255 yerine değerlere 127 için -128 değerlerini tutan yerine nerede, o zaman Uint8Array tercih edebilir.

Sunucudan bir görüntü dosyası indiren, geçici yerel depolama alanına kaydeden ve bunu bir <img> gövde içinde sunan bir copy'n'paste'n'runnable başlatma örneğidir (bunun için küçük jQuery gereklidir) Bölüm). Bu eserler current devletin olduğu gibi,

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

Not: Bu örnek dosya indirilmiş olan image.png dosyası (veya HTML JS satır içi durumunda) JS ile aynı taban klasöründe bulunan varsayar yalnızca Chrome'da.