【问题标题】:Blob constructor browser compatibilityBlob 构造函数浏览器兼容性
【发布时间】:2013-02-23 23:30:47
【问题描述】:

我正在开发一个应用程序,用于接收存储在 uint8Array 中的图像数据。 然后我将这些数据转换为 Blob,然后构建图像 url。

从服务器获取数据的简化代码:

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);      
};

构造函数:

out = new Blob([data], {type : datatype} );

Blob 构造器导致问题。它适用于除移动设备和桌面设备上的 Chrome 之外的所有浏览器。

使用 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;

桌面 Chrome 给了我一个警告ArrayBuffer values are deprecated in Blob Constructor. Use ArrayBufferView instead.

Mobile Chrome 给了我一个错误illegal constructor

如果我将构造函数更改为在 Chrome 上工作,它在其他浏览器上会失败。

【问题讨论】:

标签: javascript arrays constructor blob


【解决方案1】:

所以,这实际上是两个不同的问题。桌面 Chrome 警告是 chrome 中的 bug,自 2013 年 3 月 21 日起修复。

Mobile Chrome 给你一个 TypeError 因为不支持 blob 构造函数。相反,您必须使用旧的 BlobBuilder API。 BlobBuilder API 具有browser specific BlobBuilder 构造函数。 FF6 - 12、Chrome 8-19、Mobile 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   
    }
}

小提琴:http://jsfiddle.net/Jz8U3/13/

【讨论】:

  • 我来到了螺丝部分... :) 接下来是什么?
  • bb.append([array.buffer]) 应该是 bb.append(array.buffer)。 append 方法直接获取 ArrayBuffer 对象。
  • 为了从无用的幽灵猎杀中拯救他人,我冒昧地修正了你答案的第一段。在您发布此答案后的 13 天内,“Li Yin”(在您链接到的错误报告中)正确指出:“构造函数参数应支持 ArrayBuffer 和 ArrayBufferView。因此我们需要删除 ArrayBuffer 的已弃用警告" 并提交了一个补丁来修复不正确的弃用警告。
  • 非常感谢您的这一点......每个浏览器/SO 版本的规格对我有很大帮助。真的,谢谢!
【解决方案2】:

让它与您的代码一起使用。我只需要更改一些小细节:

if(e.name == 'TypeError' && window.BlobBuilder){
        var bb = new BlobBuilder();
        bb.append(data);
        out = bb.getBlob(datatype);
        console.debug("case 2");
    }

bb.append(数据); // 数据必须不带括号

我现在适用于所有浏览器的函数(构造函数):

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;
}

【讨论】:

  • 我猜你因为没有将其他答案作为最终解决方案而被打分。当您的问题同时使用“数据”或“[array.buffer]”并不是一个好的理由。
  • “InvalidStateError”的代码 -- new Blob([data], {type: datatype}) 似乎与您捕获的原始代码相同!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-25
  • 2012-10-19
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多