我已经把头发拉了好几个小时了,问了几次这里问了几句: 我有来自闪存录音机的二进制数据,我将其转换为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中完美运行,但是chrome 20一直告诉我myfile的大小是19个字节(当它应该是几kb时),并且随后的上传会一直失败。 这是铬中的一个错误,还是我错过了一个说不支持的文档?还有其他想法吗?
答案 0 :(得分:1)
使用某些参数调用时,看起来chrome的Blob()
构造函数中存在一个错误。
我缩小了问题on jsfiddle(在chrome中运行以查看问题,其他浏览器似乎正确处理它,两个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) {
以获得第二个替代方案
答案 1 :(得分:1)
使用我的代码将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});
}