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 にネイティブな多くのデータ型と、ファイルやブロブなどの他のいくつかの型について言及しています。
  • 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 に答える