2013-03-08 23 views
31

我正在開發一個應用程序,我接收存儲在uint8Array中的圖像數據。 然後,我將這些數據轉換爲Blob,然後構建圖像url。Blob構造函數瀏覽器兼容性

簡化代碼從服務器獲取數據:

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

團塊contsructor導致的問題。在移動設備和桌面設備上的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給了我一個WARNNINGArrayBuffer values are deprecated in Blob Constructor. Use ArrayBufferView instead.

的移動版Chrome給了我一個錯誤illegal constructor

如果我改變構造函數工作在Chrome上,它在其他瀏覽器上失敗。

+2

我張貼在這裏填充工具:http://stackoverflow.com/a/16545415/2382059 – casey 2013-05-14 14:13:05

回答

1

得到它與您的代碼工作。我只需要改變一些小細節:

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

我猜你因爲沒有把其他答案記爲最終解決方案而被打上記號。當你的問題同時使用這兩個問題時,不要在「數據」或「[array.buffer]」上尋找答案,這不是一個好的理由。 – Drew 2015-10-02 14:08:45

+2

「InvalidStateError」 - 「new Blob([data],{type:datatype})」的代碼看起來與您捕捉的原始代碼相同! – 2016-12-16 15:20:35

26

所以,這些實際上是兩個不同的問題。桌面Chrome瀏覽器警告是自2013年3月21日起固定的Chrome中的bug

由於不支持Blob構造函數,因此Mobile Chrome會爲您提供TypeError。相反,您必須使用舊的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/

+0

我來到螺絲部分...... :)下一步是什麼? – Jacob 2013-03-11 09:37:08

+2

'bb.append([array.buffer])'應該是'bb.append(array.buffer)'。 append方法直接獲取ArrayBuffer對象。 – user113215 2014-06-02 17:25:06

+0

爲了挽救他人免受無用的幽靈狩獵,我冒昧地修復了答案的第一段。在你發佈這個答案之後的13天之內,'李吟'(關於你鏈接的錯誤報告)正確地聲明:「ArrayBuffer和ArrayBufferView都應該支持構造函數參數,所以我們需要移除ArrayBuffer的棄用警告「並提交了修補程序以修復不正確的棄用警告。 – GitaarLAB 2015-03-24 00:27:10