2013-03-08 8 views
31

मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जहां मुझे uint8Array में संग्रहीत छवि डेटा प्राप्त होता है। फिर मैं इस डेटा को ब्लॉब में बदलता हूं और फिर छवि यूआरएल बनाता हूं।ब्लॉब कन्स्ट्रक्टर ब्राउज़र संगतता

सरलीकृत कोड सर्वर से डेटा प्राप्त करने के लिए:

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 समस्या का कारण है। यह मोबाइल और डेस्कटॉप उपकरणों पर क्रोम को छोड़कर सभी ब्राउज़रों पर ठीक काम करता है। ब्लॉब की

उपयोग:

// 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 मुझे एक देता warnning: illegal constructor

अगर मैं बदलने के लिए: ArrayBuffer values are deprecated in Blob Constructor. Use ArrayBufferView instead.

मोबाइल Chrome मुझे एक त्रुटि देता है काम करने के लिए निर्माता क्रोम पर यह अन्य ब्राउज़रों पर विफल रहता है।

+2

मैं यहाँ पर एक polyfill पोस्ट: http://stackoverflow.com/a/16545415/2382059 – casey

उत्तर

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

+2

"अमान्यस्टेट एरर" के लिए कोड - 'नया ब्लॉब ([डेटा], {टाइप: डेटाटाइप})' आपके कोड को पकड़ने वाले मूल कोड जैसा ही लगता है! –

26

तो, ये वास्तव में दो अलग-अलग समस्याएं हैं। डेस्कटॉप क्रोम चेतावनी क्रोम में bug थी जो 2013-03-21 के बाद से तय की गई है।

मोबाइल क्रोम आपको टाइपएरर दे रहा है क्योंकि ब्लॉब कन्स्ट्रक्टर समर्थित नहीं है। इसके बजाय आपको पुराने ब्लॉबबिल्डर एपीआई का उपयोग करना होगा। ब्लॉबबिल्डर एपीआई में browser specific ब्लॉबबिल्डर निर्माता हैं। यह एफएफ 6 - 12, क्रोम 8-19, मोबाइल क्रोम, आईई 10 और एंड्रॉइड 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

+2

'bb.append ([array.buffer])' 'bb.append (array.buffer) होना चाहिए। संलग्न विधि सीधे ऐरेबफर ऑब्जेक्ट लेती है। – user113215

+0

दूसरों को बेकार भूत-शिकार से बचाने के प्रयास में, मैंने आपके उत्तर के पहले पैराग्राफ को ठीक करने की स्वतंत्रता ली। इस उत्तर को पोस्ट करने के 13 दिनों के भीतर, 'ली यिन' (आपके द्वारा लिंक की गई बग-रिपोर्ट पर), सही ढंग से कहा गया है: "दोनों एरे बफर और ऐरेबफर व्यू को कन्स्ट्रक्टर पैरामीटर्स के लिए समर्थित होना चाहिए। इसलिए हमें ArrayBuffer के लिए बहिष्कृत चेतावनी को हटाने की आवश्यकता है "और गलत बहिष्कृत चेतावनी को ठीक करने के लिए एक पैच सबमिट किया। – GitaarLAB

संबंधित मुद्दे