2013-09-25 16 views
8

पर सामग्री-प्रकार सेट करें हम एक वेबसाकेट के नीचे Blob (छवि) स्थानांतरित कर रहे हैं और इसे दूसरे छोर पर कैनवास में प्रस्तुत कर रहे हैं।ब्लॉब

Resource interpreted as Image but transferred with MIME type text/plain: "blob:https%3A//example.com/demo". 

हम निम्नलिखित कोड का उपयोग कर वस्तु URL बनाने:

जब मैं ब्लॉब साथ createObjectURL उपयोग करते हैं, मैं इस चेतावनी मिलता है। ब्लॉब क्लाइंट की तरफ socket.binaryType = "blob"; के साथ एक मानक WebSocket के माध्यम से भेज रहा है:

socket.onmessage = function(e) { 
    var blob = e.data; 
    var url = (window.URL || window.webkitURL).createObjectURL(blob); 

    var image = document.createElement('img'); 
    image.src = url; 
} 

एक ही रास्ता मैं इस चेतावनी को संबोधित करने के बारे में सोच सकते निम्न कोड के साथ ब्लॉब की एक प्रतिलिपि बनाने के लिए है, लेकिन मुझे नहीं पता सभी डेटा की प्रतिलिपि बनाने के ओवरहेड को पेश करना चाहते हैं:

var blob = new Blob([e.data], { 
    type: 'image/gif' 
}); 

विधि प्रति सेकंड दर्जनों बार बुलाया जाता है।

new Blob के साथ डुप्लिकेट Blob ऑब्जेक्ट बनाये बिना ब्लॉब सामग्री-प्रकार को सेट करने के तरीके पर कोई विचार?

+0

क्या आप दिखा सकते हैं कि आप ब्लॉब डेटा कैसे भेजते हैं? ध्यान दें कि '.binaryType' प्रॉपर्टी केवल बाइनरी संदेश पर प्रभावी होती है - यदि आप टेक्स्ट भेज रहे हैं, तो 'event.data' में हमेशा एक स्ट्रिंग होगी। – Bergi

+0

यह बहुत आसान है: 'socket.send (संदेश); ​​'नोड जेएस अंत में। 'संदेश' एक बाइनरी ब्लॉब ऑब्जेक्ट है जो ओएसएक्स ऐप से सॉकेटरोकेट ('एनएसडीटा' प्रकार) के माध्यम से आ रहा है। संदेश निश्चित रूप से एक बाइनरी 'ब्लॉब' है। –

उत्तर

5

सबसे पहले मुझे आश्चर्य होगा कि जब आप "त्रुटि" कहेंगे तो वास्तव में आपका मतलब "चेतावनी" है। वे वास्तव में दो अलग-अलग चीजें हैं और ब्राउज़र उन्हें अलग-अलग व्यवहार करता है (जब डेवलपर टूल खुले होते हैं तो यह आमतौर पर चेतावनी को ट्रैक/उठाता है)।

तो सबसे पहले मैं इस आधार पर चुनौती दूंगा कि यह एक मुद्दा भी है (ब्राउजर "ओवर-टाइपिंग" का ओवरहेड ब्लॉब इत्यादि के ऊपर "नया" बना हुआ है।

लेकिन, उसने कहा, ब्लॉब।प्रकार की संपत्ति वास्तव में जावास्क्रिप्ट में अतुलनीय है और जैसे कि ब्लॉब "नया" होने पर आपको इसे सेट करना होगा। आपके मामले में यह लग रहा है जैसे आप एक ऑब्जेक्टिव-सी सॉकेट से डेटा हो रही है और सिर्फ डेज़ी के माध्यम से इसे नीचे चेनिंग:

ws.send(fromObjectiveCSocket, {binary: true, mask: true}); 

ऑब्जेक्टिव-सी सॉकेट से ब्लॉब डेटा ही "शीर्षक" प्रकार युक्त नहीं है जब यह इसे भेजता है तो डेटा का डेटा, और ऐसा लगता है जैसे आपका नोड ब्लॉब को स्पर्श नहीं कर रहा है (क्या आपने अपने नोड में नया ब्लॉब सजाने की कोशिश की है और फिर इसे सॉकेट के नीचे भेजकर यह देखने के लिए कि क्या यह टाइपिंग बरकरार रखता है?) ।

तो क्या हो रहा है यह है कि वेबसाईट केवल ब्लॉब डेटा भेज रहा है क्योंकि इसे प्राप्त किया गया है और जब प्राप्त जावास्क्रिप्ट इसे प्राप्त करता है, तो यह निश्चित रूप से एक खाली प्रकार के साथ एक नए ब्लॉब के साथ टाइप कर रहा है, बस एक खाली प्रकार के साथ ।

तो अनिवार्य रूप से नहीं, यदि आप वास्तव में इस चेतावनी से छुटकारा पाने के लिए नए ब्लॉब निर्माण के आसपास कोई रास्ता नहीं लगते हैं। भले ही आपने ब्लॉब डेटा में टाइप जोड़ने और फिर इसे अलग करने जैसे चालों की कोशिश की हो, फिर भी आप वेबस्केट प्राप्त करने वाले कोड के चारों ओर एक रिक्त प्रकार के साथ ब्लॉब के रूप में टाइप नहीं कर सकते हैं।

+0

कूल, धन्यवाद! आप अपनी धारणाओं के साथ फिर से स्पॉट कर रहे हैं: त्रुटि बनाम चेतावनी (और मैंने अपना प्रश्न अपडेट कर लिया है), और फिर: डेज़ी उद्देश्य-सी से, नोड के माध्यम से और क्लाइंट पर बाइनरी डेटा को चेन कर रहा है :) मैं ' टी नोड में नए ब्लॉब को सजाने की कोशिश की। कोशिश करने का सबसे अच्छा तरीका क्या है? यदि कोई डुप्लिकेशन होना है, तो इसे उच्च प्रदर्शन करने वाले सर्वर पर रखना सर्वोत्तम है। वह काम कर सकता है। मैं वर्तमान में 'CGImageDestinationCreateWithData' (टाइप 'kUTTypeGIF') के साथ उद्देश्य-सी में' टाइप' सेट कर रहा हूं) लेकिन ऐसा लगता है कि ऐसा नहीं लगता है। –

+0

@ChrisNolet - सर्वर पर इसे सजाने के द्वारा मेरा मतलब है कि नोड में नए ब्लॉब() को वास्तव में टाइप करने का प्रयास करना और वास्तव में प्रकार को सेट करना, फिर यह देखना कि सॉकेट से बाहर निकलने वाला ब्लॉब प्रकार को बरकरार रखता है ... मैं सुंदर हूं हालांकि, बाइनरी सॉकेट का उपयोग करते समय विशेष रूप से संदेहजनक है, शर्त है कि यह केवल डेटा को पास करता है ताकि ब्राउज़र अभी भी अनामिक रूप से "टाइप" कर सके। –

+0

हाँ, उचित कॉल। मेरे पास सर्वर-साइड पर एक ब्लॉब बनाने पर एक शॉट था लेकिन नोड मूल रूप से 'ब्लॉब' का समर्थन नहीं करता है। उस पर कोई और विचार? –

0

आप शायद यह

+0

हाय @Adassko। कोशिश की है लेकिन प्रकार की संपत्ति उत्परिवर्तनीय प्रतीत नहीं होती है। 'Console.lpe =' image/gif'' 'को सेट करने से पहले और बाद में 'console.log (e.data)' करने से पता चलता है कि संपत्ति नहीं बदली है। प्रश्न में कुछ और कोड जोड़ा है। –

+0

हां, मैंने इसे स्वयं से आजमाया है और मेरा जवाब संपादित किया है। सामग्री की एक प्रति के साथ एक नया ब्लॉब बनाने के साथ आपका कोड काम नहीं करता है और न ही जब आप इसका उपयोग करने का निर्णय लेते हैं – Adassko

+0

दिलचस्प - मेरे प्रश्न में प्रस्तावित (मेमोरी तीव्र) समाधान का प्रयास किया है और यह क्रोम v29 पर ठीक काम करता है, हालांकि स्वीकार्य रूप से मैं अभी तक अन्य ब्राउज़रों पर कोशिश नहीं की है। –

0

आप अंत आप छवि प्रदान कर रहे हैं से इस समस्या को हल कर सकते हैं भेजने से पहले सर्वर साइड पर अपने सामग्री प्रकार निर्धारित करना चाहिए। यह समस्या गलत सामग्री-प्रकार के कारण हो रही है, इसलिए आपको छवि सर्वर के साथ छवि भेजने के लिए अपने सर्वर को कॉन्फ़िगर करना चाहिए।

यदि यह PHP में था, आप की तरह

header("Content-Type: image/jpeg"); 
echo $image_blob; 
exit; 

(बस आपको एक विचार दे रही है)

Node.js के मामले में कुछ करना चाहिए था, हालांकि मैं एक विशेषज्ञ आप कर सकते हैं नहीं कर रहा हूँ की तरह प्रतिक्रिया वस्तु पर सामग्री प्रकार सेट करें:

app.get('/image.gif', function(req, res) { 
    res.set('Content-Type', 'image/gif'); 
    res.sendfile('./image.gif'); 
}); 
+1

अच्छा लगता है। मैं Node.js का उपयोग कर रहा हूं और 'socket.send (message) के साथ डेटा भेज रहा हूं; '' ws' पैकेज (संस्करण 0.4.x) के माध्यम से। यह संदेश मूल रूप से ऑब्जेक्टिव-सी में उत्पन्न एक अन्य वेबसाईट से एक बाइनरी पैकेट है। इस परिदृश्य में 'सामग्री-प्रकार' को सेट करने के तरीके पर कोई विचार? –

+0

@ChrisNolet, मेरा उत्तर अपडेट किया गया। – Starx

+1

धन्यवाद @Starx। ऐसा लगता है कि यह 'GET' अनुरोधों के लिए है। इस मामले में यह 'socket.binaryType = 'blob'' के साथ सभी websockets है;) –

1

"ब्लॉब URL केवल प्राप्त अनुरोध के साथ काम करते हैं, और जब एक सफलतापूर्वक अनुरोध किया जाता है, ख Rowser एक HTTP 200 ओके स्टेटस कोड भेजता है और एक सामग्री-प्रकार शीर्षलेख भी भेजता है जो ब्लॉब की प्रकार की प्रॉपर्टी का उपयोग करता है। "

var bb = new BlobBuilder(); 
var blob = bb.getBlob("x-optional/mime-type-here"); 

//send via websocket 
//load via websocket  

क्या मैं यहां पूरी तरह से बंद हूं?

मैं https://www.inkling.com/read/javascript-definitive-guide-david-flanagan-6th/chapter-22/blobs

HTML5 Rocks से यह सब मिल गया है एक्सएचआर अनुरोध से प्रतिक्रिया के साथ एक नया ब्लॉब बनाने जा रहा है। तो शायद यह सब के बाद इतना बुरा नहीं है। http://www.html5rocks.com/en/tutorials/file/xhr2/#toc-response

बस कुछ विचारों को फेंकना।

+0

विचारों के लिए धन्यवाद शेंग। मेरा मानना ​​है कि आप ब्लॉबबिल्डर का उपयोग करके अपने 'नए ब्लॉब()' समाधान के समान कुछ हासिल कर सकते हैं, हालांकि यह अप्रचलित नहीं है: https://developer.mozilla.org/en-US/docs/Web/API/BlobBuilder, और अभी भी मुझे लगता है कि 'ऐरेबफर' (वेबस्केट डेटा) से ब्लॉब में मेमोरी की प्रतिलिपि बनाना आवश्यक है - मुझे विश्वास है। –

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