javascript Blob 构造函数浏览器兼容性
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15293694/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Blob constructor browser compatibility
提问by Jacob
I am developping an application where I recieve image data stored in a uint8Array. I then transform this data to a Blob and then build the image url.
我正在开发一个应用程序,用于接收存储在 uint8Array 中的图像数据。然后我将此数据转换为 Blob,然后构建图像 url。
Simplified code to get data from server:
从服务器获取数据的简化代码:
var array;
var req = new XMLHttpRequest();
var url = "img/" + uuid + "_" +segmentNumber+".jpg";
req.open("GET", url, true);
req.responseType = "arraybuffer";
req.onload = function(oEvent) {
var data = req.response;
array = new Int8Array(data);
};
Constructor:
构造函数:
out = new Blob([data], {type : datatype} );
The Blob contsructor is causing problem. It works fine on all browsers except Chrome on mobile and desktop devices.
Blob 构造函数导致问题。它适用于移动和桌面设备上除 Chrome 之外的所有浏览器。
Use of Blob:
Blob的使用:
// Receive Uint8Array using AJAX here
// array = ...
// Create BLOB
var jpeg = new Blob( [array.buffer], {type : "image/jpeg"});
var url = DOMURL.createObjectURL(jpeg);
img.src = url;
Desktop Chromegives me a warnning: ArrayBuffer values are deprecated in Blob Constructor. Use ArrayBufferView instead.
桌面 Chrome给了我一个警告:ArrayBuffer values are deprecated in Blob Constructor. Use ArrayBufferView instead.
Mobile Chromegives me an error: illegal constructor
移动 Chrome给我一个错误:illegal constructor
If I change the constructor to work on Chrome it fails on other browsers.
如果我更改构造函数以在 Chrome 上工作,它在其他浏览器上会失败。
采纳答案by Jacob
Got it working with your code. I only had to change some little detail:
让它与你的代码一起工作。我只需要更改一些小细节:
if(e.name == 'TypeError' && window.BlobBuilder){
var bb = new BlobBuilder();
bb.append(data);
out = bb.getBlob(datatype);
console.debug("case 2");
}
bb.append(data); // data must be with no brackets
bb.append(data); // 数据必须不带括号
My function(constructor) that works now for all browsers:
我现在适用于所有浏览器的函数(构造函数):
var NewBlob = function(data, datatype)
{
var out;
try {
out = new Blob([data], {type: datatype});
console.debug("case 1");
}
catch (e) {
window.BlobBuilder = window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MozBlobBuilder ||
window.MSBlobBuilder;
if (e.name == 'TypeError' && window.BlobBuilder) {
var bb = new BlobBuilder();
bb.append(data);
out = bb.getBlob(datatype);
console.debug("case 2");
}
else if (e.name == "InvalidStateError") {
// InvalidStateError (tested on FF13 WinXP)
out = new Blob([data], {type: datatype});
console.debug("case 3");
}
else {
// We're screwed, blob constructor unsupported entirely
console.debug("Errore");
}
}
return out;
}
回答by JoeyP
So, these are actually two different problems. The Desktop Chrome warning was a bugin chrome which is fixed since 2013-03-21.
所以,这实际上是两个不同的问题。桌面 Chrome 警告是chrome中的一个错误,自 2013 年 3 月 21 日起已修复。
Mobile Chrome is giving you a TypeError because the blob constructor is not supported. Instead you must use the old BlobBuilder API. The BlobBuilder API has browser specificBlobBuilder constructors. This is the case for FF6 - 12, Chrome 8-19, Mobile Chrome, IE10 and Android 3.0-4.2.
由于不支持 blob 构造函数,移动 Chrome 会给您一个 TypeError。相反,您必须使用旧的 BlobBuilder API。BlobBuilder API 具有特定于浏览器的BlobBuilder 构造函数。这适用于 FF6 - 12、Chrome 8-19、移动版 Chrome、IE10 和 Android 3.0-4.2。
var array = new Int8Array([17, -45.3]);
try{
var jpeg = new Blob( [array], {type : "image/jpeg"});
}
catch(e){
// TypeError old chrome and FF
window.BlobBuilder = window.BlobBuilder ||
window.WebKitBlobBuilder ||
window.MozBlobBuilder ||
window.MSBlobBuilder;
if(e.name == 'TypeError' && window.BlobBuilder){
var bb = new BlobBuilder();
bb.append(array.buffer);
var jpeg = bb.getBlob("image/jpeg");
}
else if(e.name == "InvalidStateError"){
// InvalidStateError (tested on FF13 WinXP)
var jpeg = new Blob( [array.buffer], {type : "image/jpeg"});
}
else{
// We're screwed, blob constructor unsupported entirely
}
}
Fiddle: http://jsfiddle.net/Jz8U3/13/