当我尝试存储blob(通过 XMLHttpRequest
GET
请求检索时,iOS 8.4上的Safari会抛出错误:
DataCloneError: DOM IDBDatabase Exception 25: The data being stored could
not be cloned by the internal structured cloning algorithm
这发生在我的代码和这个例子中:http://robnyman.github.io/html5demos/indexeddb/
这是导致我的代码(和上面的示例)失败的行:
//This throws the error
var put = transaction.objectStore("elephants").put(blob, "image");
有没有解决这个问题? blob是否需要首先进行base64编码(就像你必须使用WebSQL一样)?
My CODE (适用于桌面Chrome / Firefox和Android上的Chrome / Firefox):
var xhr = new XMLHttpRequest();
var blob;
//Get the Video
xhr.open( "GET", "test.mp4", true );
//Set as blob
xhr.responseType = "blob";
//Listen for blob
xhr.addEventListener("load", function () {
if (xhr.status === 200) {
blob = xhr.response;
//Start transaction
var transaction = db.transaction(["Videos"], "readwrite");
//IT FAILS HERE
var put = transaction.objectStore("Videos").put(blob, "savedvideo");
}
else {
console.log("ERROR: Unable to download video." );
}
}, false);
xhr.send();
1 回答
由于一些奇怪的原因(它是_2877141_的WebSQL,你在iOS Safari 8上存储了一个BLOB在IndexedDB中 . 你必须将它转换为base64然后它将存储而没有错误 . (我再说一遍,这是一个bug)
所以,将代码更改为:
Change response type
Storing in database after retrieving from XMLHttpRequest
After retrieving form the IndexedDB, convert it back: