ইনপুটটি কোনও বৈধ বেস -64 স্ট্রিং নয় কারণ এতে একটি বেস-বেস 64 টি অক্ষর রয়েছে


98

আমার কাছে একটি আরইএসটি পরিষেবা আছে যা কোনও ফাইল পড়ে এবং এটি বাইট অ্যারেতে রূপান্তরিত করার পরে এবং অন্যদিকে বেস 64৪ স্ট্রিংয়ে অন্য কনসোল অ্যাপ্লিকেশনে প্রেরণ করে। এই অংশটি কাজ করে, তবে যখন একই স্ট্রিমটি অ্যাপ্লিকেশনটিতে পাওয়া যায়, তখন তা হেরফের হয় এবং এটি আর একটি বৈধ বেস 64 স্ট্রিং হয় না। কিছু জাঙ্ক চরিত্র প্রবাহে প্রবর্তিত হচ্ছে।

স্রোতটিকে আবার বাইটে রূপান্তর করার সময় প্রাপ্ত ব্যতিক্রমটি

ইনপুটটি কোনও বৈধ বেস -৪ string স্ট্রিং নয় কারণ এতে একটি বেস-বেস character৪ অক্ষর, দুটি প্যাডিং অক্ষর, বা প্যাডিং অক্ষরের মধ্যে একটি অ-সাদা স্থান অক্ষর রয়েছে

পরিষেবা:

[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
অ্যালেক্স ফিলিপোভিসি

4
আপনি কি জানেন যে "জাঙ্ক চরিত্রগুলি" inোকানো হচ্ছে?
জিম মিশেল

আপডেট করা কোড সহায়ক। এখন আপনার পাঠানো স্ট্রিংটি (যেমন sপরিষেবাতে) এবং প্রাপ্ত সামগ্রীগুলি আমাদের result.contentদেখতে হবে (যেমন , আপনাকে কেবল প্রথম ম্যাংলেড অক্ষর পর্যন্ত পুরো স্ট্রিং পোস্ট করার দরকার নেই (বা যদি এটি এখনও খুব দীর্ঘ হয় তবে , কিছু সাবস্ট্রিংগুলি যা কী পাঠানো হয়েছিল এবং কী প্রাপ্ত হয়েছিল তা দেখায়)
জিম মিশেল

@ জিমমিশেল হ্যাঁ, আমি লক্ষ্য করেছি যে '/' '\ /' দিয়ে প্রতিস্থাপন হচ্ছে
রোহিত ভার্মা

@ রোহিত ভার্মা স্ল্যাশ প্রতিস্থাপনের জন্য, এটি কি কাঁচা এইচটিএমএল বিষয়বস্তুতে (ফিডলার আপনাকে বলবে), বা ইন result.Content? সমস্যাটি সার্ভার বা ক্লায়েন্টের সাথে থাকলে তা আপনাকে জানাবে।
জো এনোস

উত্তর:


94

আপনার চিত্রের ডেটা শুরুর দিকে কিছু শিরোনাম তথ্য রয়েছে কিনা তা পরীক্ষা করুন:

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

এটি উপরের ত্রুটি ঘটায়।

প্রথম কমা সহ সামনের সবকিছু সরিয়ে ফেলুন এবং আপনি যেতে ভাল।

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

4
এই সঠিক সমস্যা একরকম ছিল। যুক্তি হ'ল ,যদি data:উপস্থিত থাকে তার পরে সমস্ত কিছু সরিয়ে ফেলা । বাম। কাজ করছি.
ম্যাক্সিমাম রৌলারের

var cleanerBase64 = imageCode.Substring (22); // ডেটা সরান: চিত্র /
পিএনজি

4
সাহায্যের জন্য সামান্য কিছু কোড ...... যদি (this.imageCode.Contains (',')) this.imageCode = this.imageCode.Substring (this.imageCode.IndexOf (",") + 1, this.imageCode.Length - (this.imageCode.IndexOf (",") + 1));
টবি সিমার্লিং

আমি ব্যবহার করব: .স্প্লিট (',') [1]
ভার্থোসা

4
str.Substring(str.LastIndexOf(',') + 1)এটা করা উচিত।
অ্যালিসন

65

খুব সম্ভবত এটি একটি পরিবর্তিত করুন Base64-, যেখানে রূপান্তরিত হচ্ছে এর +এবং /অক্ষর পরিবর্তিত হয় -এবং _Http://en.wikedia.org/wiki/Base64#Implementations_and_history দেখুন

যদি এটি হয় তবে আপনার এটি পরিবর্তন করতে হবে:

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

4
আমি এটি সম্পন্ন করেছি .... আপনাকে ধন্যবাদ !! চরিত্রগুলি যথাযথের সাথে প্রতিস্থাপন করা। তবে এটি কি কোন কংক্রিট সমাধান? মানে আমি কীভাবে গ্যারান্টি দিতে পারি যে সমস্ত ফাইলের জন্য এটি প্রতিস্থাপন করা চরিত্র হবে?
রোহিত ভার্মা

4
@ রোহিত ভার্মা: আমি জানি না। এই অক্ষরগুলি কোথায় পরিবর্তন হচ্ছে তা আপনাকে খুঁজে বের করতে হবে এবং এটি নির্ধারণ করতে হবে যে এটির অন্য কোনও চরিত্রের পরিবর্তন হতে পারে কিনা। আমি রেস্টশার্পের সাথে পরিচিত নই, তাই আমি সেখানে কোনও পরামর্শ দিতে পারি না। যদি আমার প্রতিক্রিয়া আপনার প্রশ্নের উত্তর দেয় তবে এটি গ্রহণযোগ্য উত্তর হিসাবে চিহ্নিত করার রীতি আছে। (বাম দিকের উত্তরের পাশে চেকমার্কটি ক্লিক করুন))
জিম মিশেল

ওএমজি আপনাকে ধন্যবাদ! এটি এবং প্রয়োজনীয় প্যাডিং যোগ করে "=" অক্ষরগুলি আমার সমস্যার সমাধান করে। আজুর কী ভল্ট REST এপিআই-এর ডিক্রিপ্ট ফাংশনটির এই প্রক্রিয়াটি প্রয়োজন এবং এটি নথিভুক্ত করে না।
42-

33

আমরা মানটির সামনে অপ্রয়োজনীয় স্ট্রিং ইনপুট সরাতে পারি।

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

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

এই সমাধানটি আমার পক্ষে কাজ করেছিল। তবে এটি বিশেষত পিএনজি চিত্রগুলির জন্য। এমন কি কোনও সাধারণীকরণের সিনট্যাক্স যা সমস্ত ধরণের চিত্রের এক্সটেনশানকে প্রতিস্থাপন করে?
করণ দেশাই

4
আমি এখন আপনার মন্তব্য পড়ে। আমি এটি চেষ্টা করে দেখতে চাই না তবে আপনি এটি ব্যবহার করতে পারেন: hdnImage.Replace ("ডেটা: চিত্র / png; বেস64,", স্ট্রিং.এম্পটি) "ডেটা: চিত্র / বিএমপি; বেস 64,", স্ট্রিং.এম্পটি); আবার, আমি এটি চেষ্টা করবেন না। আমার জন্য চেষ্টা করুন এবং লিখুন। আমি পরিবর্তন করতে হবে.
হাসান টুনা ওরুç

5

আপনি আপলোড করা চিত্রের ধরণটি জানেন না এবং কেবল আপনাকে এর 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]);

বিভক্ত এবং তালিকাতে? পরিবর্তে সূচক এবং সাবস্ট্রিং ব্যবহার করুন
ইমানুয়েল গ্লাইজার

দেখতে demeranville.com/... এবং প্রশ্ন এছাড়াও এখানে পোস্ট করা হয়েছে: stackoverflow.com/questions/35388181/...
এমানুয়েল Gleizer

4

যেহেতু আপনি JSON হিসাবে কোনও স্ট্রিং ফিরিয়ে দিচ্ছেন, সেই স্ট্রিংয়ের মধ্যে কাঁচা প্রতিক্রিয়ার খোলার এবং সমাপনী উদ্ধৃতি অন্তর্ভুক্ত থাকবে। সুতরাং আপনার প্রতিক্রিয়া সম্ভবত দেখতে হবে:

"abc123XYZ=="

বা যাই হোক না কেন ... আপনি এটি ফিডলারের সাথে নিশ্চিত করার চেষ্টা করতে পারেন।

আমার অনুমান যে result.Contentউদ্ধৃতিগুলি সহ কাঁচা স্ট্রিং। যদি এটি হয় তবে result.Contentএটি ব্যবহার করার আগে আপনার ডিসরিয়ালাইজ করা দরকার।


আপনি সঠিক, এটিতে "" অন্তর্ভুক্ত রয়েছে তবে এখানে বক্তব্যটি হ'ল এই উদ্ধৃতি চিহ্নগুলি যোগ করার সাথে সাথে অন্যান্য চরিত্রগুলিও প্রতিস্থাপন করা হচ্ছে।
রোহিত ভার্মা

একটি 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);

3
var spl = item.Split('/')[1];
var format =spl.Split(';')[0];           
stringconvert=item.Replace($"data:image/{format};base64,",String.Empty);

7
এই কোড সমস্যা সমাধানের পারে যদিও, একটি ভাল উত্তর এছাড়াও ব্যাখ্যা করতে হবে কি কোড করে এবং কিভাবে এটা সাহায্য করে।
বিডিএল

2

রেজেক্সের মাধ্যমে অপ্রয়োজনীয় স্ট্রিংটি সরান

Regex regex=new Regex(@"^[\w/\:.-]+;base64,");
base64File=regex.Replace(base64File,string.Empty);

1

অ্যালেক্স ফিলিপোভিসি যেমন উল্লেখ করেছিলেন বিষয়টি একটি ভুল এনকোডিং। আমি যে ফাইলটি পড়েছি তা হ'ল UTF-8-BOMএবং উপরের ত্রুটিটি টিপুন Convert.FromBase64String()UTF-8সমস্যা ছাড়াই কাজ করাতে পরিবর্তন করা ।


1

এবং কিছু সময় এটি ডাবল কোট দিয়ে শুরু হয়েছিল, বেশিরভাগ সময় আপনি ফাইল পাওয়ার জন্য ডটনেটকোর 2 থেকে এপিআই কল করেন

string string64 = string64.Replace(@"""", string.Empty);
byte[] bytes = Convert.ToBase64String(string64);

4
স্ট্রিং থেকে বাইটে রূপান্তর করা যায় না []
উড়সকুইরেল

1

সম্ভবত স্ট্রিংটি এই data:image/jpeg;base64,/9j/4QN8RXh... প্রথম বিভক্তির মতো /হবে এবং দ্বিতীয় টোকেন পাবে।

var StrAfterSlash = Face.Split('/')[1];

তারপরে বিভক্ত করুন ;এবং প্রথম টোকেন যা ফর্ম্যাট হবে। আমার ক্ষেত্রে এটি jpeg।

var ImageFormat =StrAfterSlash.Split(';')[0];

তারপরে data:image/jpeg;base64,সংগ্রহ করা বিন্যাসের জন্য লাইনটি সরান

CleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.