2012-12-10 29 views
11

के साथ सर्वर से छवि में लोड की गई बाइनरी छवि मैं XMLHttpRequest के माध्यम से बाइनरी प्रारूप में अपने सर्वर से एक जेपीईजी छवि लोड कर रहा हूं (मुझे इसे इस तरह की आवश्यकता है)। यह बेस 64 एन्कोडेड नहीं है।जावास्क्रिप्ट

क्या यह जावास्क्रिप्ट के साथ एक आईएमजी ऑब्जेक्ट में बदलना संभव है?

धन्यवाद

उत्तर

4

XMLHttpRequest की वर्ण एन्कोडिंग something that won't change the binary data करने के लिए सेट किया गया है, या आपने set the response type, आप तो .responseTextbtoa (बेस 64 में डालने और इसकी सूचना देने के एक डेटा यूआरआई के रूप में निर्दिष्ट) के माध्यम से चला सकते हैं या क्रमशः बाइनरी डेटा के लिए .response एक्सेस करें।


अपने उदाहरण मानते हुए xhr नाम पर है और आप xhr.send से पहले चारसेट विधि का उपयोग कर रहे हैं, लेकिन xhr.open के बाद

xhr.overrideMimeType("text/plain; charset=x-user-defined"); 

कर फिर जब आप कर रहे हैं 200 OK

var dataURI = 'data:image/jpeg;base64,' + btoa(xhr.responseText); 

कौन सा आप कर सकते हैं फिर <img> के src के रूप में सेट करें।


फिर xhr संभालने, इस बार .response विधि; तब से .open और .send के बीच,

xhr.responseType = "arraybuffer"; 

200 OK

var arrayBufferView = new Uint8Array(xhr.response), // can choose 8, 16 or 32 depending on how you save your images 
    blob = new Blob([arrayBufferView], {'type': 'image\/jpeg'}), 
    objectURL = window.URL.createObjectURL(blob); 

जो तुम तो एक <img> के src के रूप में सेट कर सकते हैं। Example

+0

इसे एक इनलाइन छवि कहा जाता है। ध्यान दें कि IE8 केवल इनलाइन छवियों का समर्थन करता है जो 32 KB से कम हैं (बेस 64 एन्कोडेड डेटा के लिए, इसलिए स्रोत छवि को 24 KB से कम होना होगा), और आईई 7 और इससे पहले इनलाइन छवियों का समर्थन नहीं करते हैं (यदि यह मायने रखता है)। –

+0

ने कोशिश की, लेकिन 'btoa (xhr.responseText)' वापस लौटता रहता है 'त्रुटि: INVALID_CHARACTER_ERR: DOM अपवाद 5'। मुझे नहीं पता कि ऐसा क्यों होता है। आईई 7/आईई 8 के लिए ... मुझे इसके साथ निपटने के लिए एक फ्लैश ऑब्जेक्ट बनाना होगा – Marc

+0

@Marc ऐसा होता है क्योंकि 'btoa' में कुछ [बग] हैं (https://bugzilla.mozilla.org/show_bug.cgi? आईडी = 213047) (समान/समान वेबकिट पर भी लागू होता है), मैं _ArrayBuffer_ -> 'Blob' -> _URL.createObjectURL_ विधि के माध्यम से उत्तर अपडेट करूंगा, जो मेरी राय में _FileReader_ के माध्यम से थोड़ा बेहतर है लेकिन अभी भी उतना अच्छा नहीं है _btoa_ के रूप में। –