【问题标题】:data:URL to Blob - issue with chromium数据:Blob 的 URL - 铬问题
【发布时间】:2012-12-12 14:07:15
【问题描述】:

几个小时以来,我一直在努力解决一个在这里被问过几次的问题: 我有来自闪存录音机的二进制数据,我将其转换为 dataURL,然后想转换为 blob 进行上传。 SO给了我几个答案,基本上都是一样的:

我根据上面写了如下代码

var data = window.atob(dataURL.split(',')[1]);
var length = data.length;
var uInt8Array = new Uint8Array(length);
for (var i = 0; i < length; ++i) {
    uInt8Array[i] = data.charCodeAt(i);
}
var myfile = new Blob([uInt8Array], {'type': 'audio/x-wav'});

这在 firefox nightly (20) 和 chrome 25 中完美运行,但 chromium 20 一直告诉我 myfile 的大小是 19 字节(当它应该是几个 kb 时),随后的上传始终失败。 这是铬中的一个错误,还是我错过了一个说它还不支持的文档?有其他的想法吗?

【问题讨论】:

  • 虽然this answer 表示BlobBuilder API 已被弃用,但您是否尝试过在Chromium 上使用它?该答案中的示例代码填充了无类型数组,然后将其转换为有类型数组。我不明白为什么这很重要,但是您尝试过吗?一个 jsfiddle 可能很有用...
  • 好吧,看起来 BlobBuilder/webkitBlobBuilder 在铬中已经不存在了,所以我什至无法使用它...
  • 哦,是的,我确实先尝试了无类型数组,但运气不好。

标签: javascript chromium


【解决方案1】:

在使用某些参数调用时,chromium 的 Blob() 构造函数中似乎存在错误。 我缩小了问题on jsfiddle(在 chromium 中运行以查看问题,其他浏览器似乎可以正确处理它,两个 blob 大小都应该是 32)

这是我为解决它而整理的代码:

var data = window.atob(dataURL.split(',')[1]);
var length = data.length;
var buffer = new ArrayBuffer(length);   // added this line
var uInt8Array = new Uint8Array(buffer);
for (var i = 0; i < length; ++i) {
    uInt8Array[i] = data.charCodeAt(i);
}
// two options here:
// buggy: produces a 19byte long file in chromium
var myfile = new Blob([uInt8Array], {'type': 'audio/x-wav'});
// works in chromium (and firefox), but produces a deprecation warning in chrome
var myfile = new Blob([buffer], {'type': 'audio/x-wav'});

我最终运行了第一个替代方案,然后if (myfile.size == 19) { 获得第二个替代方案(如果需要)

【讨论】:

【解决方案2】:

使用我的代码将 dataURI 转换为 blob。

function dataURLtoBlob(dataURL) {
    var arr = dataURL.split(','), mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
    while(n--){
        u8arr[n] = bstr.charCodeAt(n);
    }
    return new Blob([u8arr], {type:mime});
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多