2013-02-27 123 views
48

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

धारा को वापस बाइट में कनवर्ट करते समय मुझे प्राप्त अपवाद है "इनपुट मान्य बेस -64 स्ट्रिंग नहीं है क्योंकि इसमें गैर-बेस 64 वर्ण, दो से अधिक पैडिंग वर्ण, या गैर-सफेद पैडिंग वर्णों के बीच अंतरिक्ष चरित्र "

सेवा में:

[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Json)] 
public string ExportToExcel() 
    { 
     string filetoexport = "D:\\SomeFile.xls"; 
     byte[] data = File.ReadAllBytes(filetoexport); 
     var s = Convert.ToBase64String(data); 
     return s; 
    } 

आवेदन पर:

 var client = new RestClient("http://localhost:56877/User/"); 
     var request = new RestRequest("ReadFile/Convert", RestSharp.Method.GET); 
     request.AddHeader("Accept", "application/Json"); 
     request.AddHeader("Content-Type", "application/Json"); 
     request.OnBeforeDeserialization = resp => {resp.ContentType = "application/Json";}; 
     var result = client.Execute(request); 
     byte[] d = Convert.FromBase64String(result.Content); 
+4

शायद यह 'Encoding' से कोई लेना देना नहीं है। –

+1

क्या आप जानते हैं कि "जंक कैरेक्टर" क्या डाले जा रहे हैं? –

+0

अद्यतन कोड सहायक है। अब हमें आपके द्वारा भेजी गई स्ट्रिंग (यानी सेवा पर 's ') और प्राप्त सामग्री (यानी' result.content') देखने की आवश्यकता है। आपको पूरी स्ट्रिंग पोस्ट करने की आवश्यकता नहीं है, केवल पहले उलझन वाले चरित्र तक (या, यदि यह अभी भी बहुत लंबा है, तो कुछ सबस्ट्रिंग जो दिखाती हैं कि क्या भेजा गया था और क्या प्राप्त हुआ था) –

उत्तर

45
बहुत संभवतः

यह एक संशोधित Base64, जहां + और / पात्रों - और _ में बदल दिया जाता करने के लिए परिवर्तित रही है । http://en.wikipedia.org/wiki/Base64#Implementations_and_history

देखें अगर ऐसी बात है, आप इसे वापस बदलने की जरूरत:

string converted = base64String.Replace('-', '+'); 
converted = converted.Replace('_', '/'); 
+0

मुझे यह मिल गया .... धन्यवाद! अक्षरों को उचित लोगों के साथ बदलना। लेकिन क्या यह एक ठोस समाधान है? मेरा मतलब है कि मैं कैसे गारंटी दे सकता हूं कि सभी फाइलों के लिए यह प्रतिस्थापित किया जाएगा? –

+1

@ रोहित वर्मा: मुझे नहीं पता। आपको इसकी आवश्यकता है पता लगाएं कि वे पात्र कहाँ हैं टिंग बदल गया, और यह निर्धारित करता है कि क्या यह किसी अन्य पात्र को बदलने की संभावना है। मैं रेस्टशर्प से परिचित नहीं हूं, इसलिए मैं वहां कोई सलाह नहीं दे सकता। अगर मेरी प्रतिक्रिया ने आपके प्रश्न का उत्तर दिया है, तो इसे स्वीकार्य उत्तर के रूप में चिह्नित करने के लिए प्रथागत है। (बाईं ओर दिए गए उत्तर के बगल में स्थित चेकमार्क पर क्लिक करें।) –

1

आप JSON के रूप में एक स्ट्रिंग लौट रहे हैं के बाद से, कि स्ट्रिंग कच्चे जवाब में उद्घाटन और समापन उद्धरण शामिल होंगे। तो आपकी प्रतिक्रिया शायद इस तरह दिखनी चाहिए:

"abc123XYZ==" 

या जो कुछ भी ... आप फिडलर के साथ इसकी पुष्टि करने का प्रयास कर सकते हैं।

मेरा अनुमान है कि result.Content उद्धरण समेत कच्ची स्ट्रिंग है। यदि ऐसा है, तो result.Content को इसका उपयोग करने से पहले deserialized की आवश्यकता होगी।

+0

आप सही हैं, इसमें "" शामिल है लेकिन यहां बिंदु यह है कि इन उद्धरण चिह्नों के अलावा अन्य पात्रों को भी प्रतिस्थापित किया जा रहा है। –

+0

एक जेएसओएन सीरियलाइज़र का उपयोग करके स्ट्रिंग deserializing उद्धरण और बच निकले स्लैश दोनों का ख्याल रखेगा। बैकस्लैश के साथ आपके आगे की स्लैश से बचने से कुछ ऐसा होता है जो कुछ JSON serializers करते हैं - एक deserializer का उपयोग करके \/वापस सादे/बारी में बदल जाएगा ताकि आपको वैध आधार -64 मिले। चूंकि आप JSON प्राप्त कर रहे हैं, इसलिए JSON को सही तरीके से पार्स करना हमेशा अच्छा विचार है, भले ही यह केवल एक साधारण स्ट्रिंग है। –

3

मैंने आपके जैसा वर्णित एक समान संदर्भ व्यवस्थित किया और मुझे एक ही त्रुटि का सामना करना पड़ा। मैं " को शुरुआत और सामग्री के अंत से \/ को / के साथ बदलकर इसे काम करने में कामयाब रहा। ,

var result = client.Execute(request); 
var response = result.Content 
    .Substring(1, result.Content.Length - 2) 
    .Replace(@"\/","/"); 
byte[] d = Convert.FromBase64String(response); 

एक विकल्प के रूप में आप प्रतिक्रिया स्वरूप के लिए XML का उपयोग पर विचार हो सकता:

यहाँ कोड का टुकड़ा है

[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)] 
public string ExportToExcel() { //... } 

ग्राहक के पक्ष में:

request.AddHeader("Accept", "application/xml"); 
request.AddHeader("Content-Type", "application/xml"); 
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/xml"; }; 

var result = client.Execute(request); 
var doc = new System.Xml.XmlDocument(); 
doc.LoadXml(result.Content); 
var xml = doc.InnerText; 
byte[] d = Convert.FromBase64String(xml); 
34

जांचें कि क्या आपके छवि डेटा में शुरुआत में कुछ शीर्षलेख जानकारी है:

imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC... 

इससे उपर्युक्त त्रुटि होगी।

बस पहले कॉमा के सामने सबकुछ हटा दें, और आप जाने के लिए अच्छे हैं।

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC... 
+0

किसी भी तरह से यह सही मुद्दा था। तर्क ''' के बाद सबकुछ हटाने के लिए है, यदि' डेटा: 'मौजूद है। बैम। अभी व्यस्त हूँ। –

13

हम मूल्य के सामने अनावश्यक स्ट्रिंग इनपुट को हटा सकते हैं।

string convert = hdnImage.Replace("data:image/png;base64,", String.Empty); 

byte[] image64 = Convert.FromBase64String(convert); 
+0

यह समाधान मेरे लिए काम किया। लेकिन यह विशेष रूप से पीएनजी छवियों के लिए है। क्या कोई सामान्यीकृत वाक्यविन्यास है जो सभी प्रकार के छवि एक्सटेंशन को प्रतिस्थापित करता है? –

+0

अब मैंने आपकी टिप्पणी पढ़ी है। मैं यह कोशिश नहीं करता लेकिन आप इसका उपयोग कर सकते हैं: hdnImage.Replace ("डेटा: छवि/पीएनजी; बेस 64,", स्ट्रिंग। लक्षण)। जगह ("डेटा: छवि/जेपीजी; बेस 64,", स्ट्रिंग। लक्षण)। जगह ("डेटा: छवि/बीएमपी; बेस 64,", स्ट्रिंग। लक्षण); दोबारा, मैं यह कोशिश नहीं करता। कृपया मेरे लिए कोशिश करें और लिखें। मैं बदलूँगा। –

1

बस मामले में आप अपलोड की गई छवि के प्रकार पता नहीं है, और तुम सिर्फ तुम अपने base64 हैडर हटाने की जरूरत:

var imageParts = model.ImageAsString.Split(',').ToList<string>(); 
//Exclude the header from base64 by taking second element in List. 
byte[] Image = Convert.FromBase64String(imageParts[1]); 
+0

विभाजित और सूची में? बजाय इंडेक्सऑफ और सबस्ट्रिंग –

+0

@EmmanuelGleizer का उपयोग करना अधिक कुशल है? –

+0

देखें http://demeranville.com/battle-of-the-tokenizers-delimited-text-parser-performance/ और प्रश्न यहां भी पोस्ट किया गया है: https://stackoverflow.com/questions/35388181/split-method- बनाम-सबस्ट्रिंग और indexOf –