2012-01-12 88 views
4

如何將二進制數據(在ArrayBuffer對象中)保存到IndexedDB中?在IndexedDB中保存ArrayBuffer

IndexedDB規範沒有提到ArrayBuffer - 這是否意味着不支持(並且我必須將ArrayBuffer打包爲字符串或數組?)。

回答

4

在FF的最新版本(每晚)中,這非常簡單。見this bug

window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || 
        window.MozBlobBuilder; 

var bb = new BlobBuilder(); 
bb.append(arrayBuffer); 
var myblob = bb.getBlob(); 

indexedDB.open("mydatabase").onsuccess = function(e) { 
    var db = e.result; 
    var trans = db.transaction(["objectstore1", "objectstore2", READ_WRITE); 
    trans.objectStore("objectstore1").put(myblob, "somekey"); 
    trans.objectStore("objectstore2").put(myblob, "otherkey"); 
}; 

連:

objectStore.put({ name: "Santa", age: 400, height: 185, img: myblob}); 

有在Chrome一樣開放的錯誤:crbug.com/108012

+0

有沒有切肉刀的方法來測試瀏覽器是否支持它?我目前在FF和Chrome中遇到崩潰。 – Mortennobel 2012-01-12 18:50:59

+1

不是我所知道的,除了寫一些代碼來測試'put()'是否成功。 – ebidel 2012-01-12 19:33:34

+0

@ebidel您的代碼中存在一個小錯誤:「objectstore2」後缺少右括號 – unwichtich 2013-06-12 09:48:39

11

只節省ArrayBuffer應該 「只是工作」。我相信它在所有當前的IndexedDB實現中都有。

I.e.類似於:

var trans = db.transaction("mystore", IDBTransaction.READ_WRITE); // or "readwrite" 
trans.objectStore("mystore").put(myArrayBuffer, "mykey"); 

發現這是由規範定義的...挑戰......至少可以說。但它是這樣的:

  • IndexedDB對所有存儲的數據使用「結構化克隆」定義。
  • 「結構化克隆」在HTML5規範中定義,並提到了很多原生Javascript數據類型和一些其他類型的文件和Blob。
  • Khronos的ArrayBuffer規範定義了ArrayBuffers,並指定將「結構化克隆」的HTML5定義更改爲克隆ArrayBuffers。

是的,我知道,我也找不到它。