• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

javascript - 尝试在 iOS Safari 8 中存储 blob 会引发 DataCloneError

[复制链接]
菜鸟教程小白 发表于 2022-12-12 09:08:16 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

当我尝试存储 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 一样)?

我的代码 (适用于桌面版 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();



Best Answer-推荐答案


出于某些奇怪原因(这是一个错误),就像 iOS Safari 7 的 WebSQL 一样,您不能在 iOS Safari 8 上的 IndexedDB 中存储 BLOB。您必须转换它到base64,然后它将存储而不会出错。 (我再说一遍,这是一个错误)

所以,把代码改成这样:

更改响应类型

xhr.responseType = "arraybuffer";

从 XMLHttpRequest 检索后存储在数据库中

//We'll make an array of unsigned ints to convert
var uInt8Array = new Uint8Array(xhr.response);
var i = uInt8Array.length;
var binaryString = new Array(i);
while (i--)
{
    //Convert each to character
    binaryString[i] = String.fromCharCode(uInt8Array[i]);
}

//Make into a string
var data = binaryString.join('');

//Use built in btoa to make it a base64 encoded string
var base64 = window.btoa(data);

//Now we can save it
var transaction = db.transaction(["Videos"], "readwrite");
var put = transaction.objectStore("Videos").put(base64, "savedvideo");

从 IndexedDB 检索后,将其转换回来:

//Convert back to bytes
var data = atob( event.target.result );

//Make back into unsigned array
var asArray = new Uint8Array(data.length);

for( var i = 0, len = data.length; i < len; ++i ) 
{
    //Get back as int
    asArray[i] = data.charCodeAt(i);    
}

//Make into a blob of proper type
var blob = new Blob( [ asArray.buffer ], {type: "video/mp4"} );

//Make into object url for video source
var videoURL = URL.createObjectURL(blob);

关于javascript - 尝试在 iOS Safari 8 中存储 blob 会引发 DataCloneError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32901733/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap