8

如何将二进制数据(在 ArrayBuffer 对象中)保存到 IndexedDB?

IndexedDB 规范没有提到 ArrayBuffer - 这是否意味着不支持(我必须将 ArrayBuffer 打包为字符串或数组?)。

4

2 回答 2

16

简单地保存 ArrayBuffer 应该“正常工作”。我相信它适用于所有当前的 IndexedDB 实现。

即类似的东西:

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。

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

于 2012-06-15T23:13:48.423 回答
5

在 FF 的最新(夜间)版本中,这非常容易。看到这个错误

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

于 2012-01-12T15:38:57.437 回答