2012-01-12 83 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。

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