2014-04-11 8 views
19

मैं अनुरोधित छवि को अपने आरईएसटी एपीआई से बेस 64 स्ट्रिंग में पार्स करना चाहता हूं।बेस 64 में प्रतिक्रिया से बाइनरी छवि स्ट्रिंग कैसे करें?

enter image description here

सबसे पहले ... मैंने सोचा था कि, यह आसान हो सकता है, सिर्फ इस उद्देश्य के लिए window.btoa() समारोह का उपयोग करने के।

जब मैं अपने आवेदन के ऐसे हिस्से में यह करने के लिए प्रयास करें:

.done(function(response, position) { 
    var texture = new Image(); 
    texture.src = "data:image/png;base64," + window.btoa(response); 

मैं अगले त्रुटि मिल गया है: Uncaught InvalidCharacterError: 'विंडो' पर 'btoa' निष्पादित करने में विफल: स्ट्रिंग के लिए एन्कोडेड में लैटिन 1 रेंज के बाहर वर्ण शामिल हैं।

के रूप में मैं यहाँ पढ़ें: newlines in the response की वजह से javascript atob returning 'String contains an invalid character'

समस्या इसलिए होती है और यही कारण है window.btoa() में विफल रहा है। पाठ्यक्रम के किसी भी बाइनरी छवि प्रारूप में नई लाइनें होंगी ... लेकिन सुझाव के ऊपर दिए गए लिंक से उन पात्रों को हटाना/प्रतिस्थापित करना था - मेरे लिए एक बुरा सुझाव है, क्योंकि बाइनरी छवि से कुछ पात्रों को हटाने/बदलने के लिए दूषित हो जाओ

बेशक

, संभव विकल्पों एपीआई डिजाइन से संबंधित हैं: - अगर मैं मरम्मत नहीं होगा कुछ समारोह, जो छवि

को यूआरएल लौट जोड़ने के लिए - कुछ समारोह है, जो बेस 64 प्रतिनिधित्व लौट जोड़ने के लिए यह, मैं सर्वर से बेस 64 प्रतिनिधित्व वापस कर दूंगा, लेकिन मुझे ऐसा कोई तरीका पसंद नहीं है।

प्रतिक्रिया से हैंडलिंग बाइनरी छवि के साथ मेरी समस्या को हल करने का कोई तरीका मौजूद है, जैसा कि यह स्क्रीनशॉट के हिस्से में ऊपर दिखाया गया है, है ना?

+0

आप एपीआई पक्ष का उपयोग कर रहे क्या है? – FabianCook

+0

@ फ़ैबियनकूक वास्तव में कहां है? जहां मैंने बेस 64/यूआरएल या कहां लौटने के लिए एपीआई बदलने का सुझाव दिया है? यदि आपने मुझे सावधानी से पढ़ा है, तो मैं इसका उपयोग न करने का कोई तरीका ढूंढना चाहता हूं और किसी अन्य तरीके/चाल का उपयोग करने का प्रयास करना चाहता हूं। सर्वर-साइड से बेस 64 प्रतिक्रिया बनाने के लिए - कोई समस्या नहीं, लेकिन मुझे बाइनरी छवि के रूप में इसे संभालने का तरीका खोजने की इच्छा है। –

+0

आह ठीक है। चारों ओर देखो। लूट। – FabianCook

उत्तर

-3

बेस 64 छवि डेटा

<img src="data:image/png;base64,' + responce + '" />

+0

अमान्य वर्णों को इसे रोकना चाहिए। वह क्या पूछ रहा है। – FabianCook

+0

यह वेबजीएल प्रोजेक्ट के लिए है, न केवल इसे स्थिर छवि के रूप में दिखा रहा है, और फिर 'अवैध वर्ण' ... –

1

इम स्ट्रिंग पर escape उपयोग करने के लिए इससे पहले कि आप कार्य करने के लिए पारित अनुमान लगा जैसे मेरे लिए काम किया है, API कॉल मैं अपने आप को परीक्षण नहीं कर सकते बिना।

परीक्षण

encodeURI("testñ$☺PNW¢=") 

रिटर्न

"test%C3%B1$%E2%98%BAPNW%C2%A2=" 

यह सिर्फ सभी पात्रों पलायन, यह स्ट्रिंग

परीक्षण

encodeURI("¶!┼Æê‼_ðÄÄ┘Ì+\+,o▬MBc§yþó÷ö") 

retur में सभी अवैध वर्ण से बचें चाहिए एनएस

"%C2%B6!%E2%94%BC%C3%86%C3%AA%E2%80%BC_%C3%B0%C3%84%C3%84%E2%94%98%C3%8C++,o%E2%96%ACMBc%C2%A7y%C3%BE%C3%B3%C3%B7%C3%B6" 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI

+0

मुझे डर है कि बचने से छवि भ्रष्ट हो जाएगी, इसलिए कुछ वर्णों से बचने के बाद इसे दिखाया नहीं जा सकता है, क्योंकि सही छवि शो के लिए कुछ न्यूलाइन और बाइनरी वर्णों की आवश्यकता होती है, लेकिन मेरे लिए मदद और खर्च का समय धन्यवाद। –

+0

मैं उस सुविधा अनुरोध को प्राप्त करने का सुझाव दूंगा। – FabianCook

0

मुद्दा आप का सामना कर रहे है कि प्रतिक्रिया एक यूनिकोड स्ट्रिंग माना जा रहा है।यूनिकोड स्ट्रिंग्स पर अनुभाग देखें: window.btoa

कई समाधान इस post

+1

प्रतिक्रिया एक बाइनरी प्रारूप है, एक पाठ नहीं है (इसलिए यह मुझे लगता है कि यह यूनिकोड स्ट्रिंग नहीं हो सकता है), यदि आप ध्यान से देखते हैं, तो मैंने पीएनजी छवि –

+0

@GeloVolro की बाइनरी सामग्री को पकड़ लिया है - मैंने देखा । जब मैंने बीटा का उपयोग करके एक ही त्रुटि प्राप्त की तो मैंने कुछ खोज की। मुझे यकीन नहीं है कि क्रोम ऑब्जेक्ट्स को उनके चारों ओर उद्धरण के साथ प्रदर्शित करता है, लेकिन डेटा प्रदर्शित करने पर विचार करने से मुझे लगता है कि यह एक स्ट्रिंग है। चूंकि ऐसा लगता है कि आप jQuery का उपयोग कर रहे हैं, तो आप प्रकार को देखने के लिए jQuery.type (प्रतिक्रिया) का उपयोग कर सकते हैं। – HungryBeagle

14

में की पेशकश कर रहे मुझे लगता है कि समस्या आप कम पड़ रहा है की बात यह है कि jQuery.ajaxnot देशी रूप का समर्थन नहीं करता XHR2 ब्लॉब/arraybuffer प्रकार जो अच्छी तरह से संभाल सकता है बाइनरी डेटा (Reading binary files using jQuery.ajax देखें)।

यदि आप xhr.responseType = 'arraybuffer' के साथ मूल XHR ऑब्जेक्ट का उपयोग करते हैं, तो प्रतिक्रिया सरणी पढ़ें और इसे बेस 64 में परिवर्तित करें, आपको वह चाहिए जो आप चाहते हैं।

// http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/ 
 
function fetchBlob(uri, callback) { 
 
    var xhr = new XMLHttpRequest(); 
 
    xhr.open('GET', uri, true); 
 
    xhr.responseType = 'arraybuffer'; 
 

 
    xhr.onload = function(e) { 
 
    if (this.status == 200) { 
 
     var blob = this.response; 
 
     if (callback) { 
 
     callback(blob); 
 
     } 
 
    } 
 
    }; 
 
    xhr.send(); 
 
}; 
 

 
fetchBlob('https://i.imgur.com/uUGeiSFb.jpg', function(blob) { 
 
    // Array buffer to Base64: 
 
    var str = btoa(String.fromCharCode.apply(null, new Uint8Array(blob))); 
 

 
    console.log(str); 
 
    // Or: '<img src="data:image/jpeg;base64,' + str + '">' 
 
});

https://jsfiddle.net/oy1pk8r3/2/

बेस 64 का उत्पादन इनकोडिंग कंसोल आउटपुट: /9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAIBAQIBAQICAgICAgICAw.....

+1

धन्यवाद, मुझे यह समझने में थोड़ी देर लग गई कि इसने टाइपो की वजह से अपना मुद्दा हल किया, लेकिन यह मेरे लिए काम करता था। – olleicua

+1

मेरे लिए काम किया, –

+1

साझा करने के लिए धन्यवाद, बहुत धन्यवाद, यह हमारे दिन को बचाया ... चीयर्स ... –

3

बजाय _arrayBufferToBase64 साथ ब्लॉब के माध्यम से पाशन (

यहाँ एक समाधान है कि मेरे लिए काम करता है), उपयोग करें लागू() रूपांतरण करने के लिए, यह 30 बार अपने ब्राउज़र में तेजी से और अधिक संक्षिप्त है

// http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/ 
 
function fetchBlob(uri, callback) { 
 
    var xhr = new XMLHttpRequest(); 
 
    xhr.open('GET', uri, true); 
 
    xhr.responseType = 'arraybuffer'; 
 

 
    xhr.onload = function(e) { 
 
    if (this.status == 200) { 
 
     var blob = this.response; 
 
     if (callback) { 
 
     callback(blob); 
 
     } 
 
    } 
 
    }; 
 
    xhr.send(); 
 
}; 
 

 
fetchBlob('https://i.imgur.com/uUGeiSFb.jpg', function(blob) { 
 
    var str = String.fromCharCode.apply(null, new Uint8Array(blob)); 
 
    console.log(str); 
 
    // the base64 data: image is then 
 
    // '<img src="data:image/jpeg;base64,' + btoa(str) + '" />' \t 
 
});

+0

बचाया है मैंने इसे उपरोक्त उत्तर में शामिल किया है। – fotinakis

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