在IndexedDB中保存ArrayBuffer

Mor*_*bel 5 firefox html5 google-chrome arraybuffer indexeddb

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

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

小智 14

只需保存ArrayBuffer即可"正常工作".我相信它在所有当前的IndexedDB实现中都有.

就像这样:

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

发现这是由规范定义的......具有挑战性......至少可以说.但它是这样的:

  • IndexedDB对所有存储的数据使用"结构化克隆"定义.
  • "结构化克隆"在HTML5规范中定义,并提到了许多Javascript原生的数据类型以及一些其他类型的文件和Blob.
  • Khronos的ArrayBuffer规范定义了ArrayBuffers,并指定应该更改"结构化克隆"的HTML5定义以克隆ArrayBuffers.

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


ebi*_*del 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");
};
Run Code Online (Sandbox Code Playgroud)

甚至:

objectStore.put({ name: "Santa", age: 400, height: 185, img: myblob});
Run Code Online (Sandbox Code Playgroud)

Chrome 中有一个相同的开放错误:crbug.com/108012

  • 我想投反对票,而不是投赞成票。BlobBuilder 不是一个真正的函数,它要么已被弃用,要么从未成为标准。 (3认同)