入力にBase64以外の文字が含まれているため、入力は有効なBase64文字列ではありません


98

ファイルを読み取り、バイト配列に変換してからBase64文字列に変換した後、別のコンソールアプリケーションに送信するRESTサービスがあります。この部分は機能しますが、同じストリームがアプリケーションで受信されると、操作され、有効なBase64文字列ではなくなります。一部のジャンクキャラクターがストリームに導入されています。

ストリームをバイトに戻すときに受け取る例外は次のとおりです。

入力には、Base 64以外の文字、3つ以上のパディング文字、またはパディング文字の中に空白以外の文字が含まれているため、有効なBase-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ます。
Alex Filipovici 2013

1
どの「ジャンク文字」が挿入されているか知っていますか?
ジムミッシェル2013

更新されたコードは役に立ちます。次に、送信する文字列(つまりs、サービス上)と受信したコンテンツ(つまりresult.content、最初のマングル文字まで(または、それでも長すぎる場合)に文字列全体を投稿する必要はありません)を確認する必要があります。 、何が送信され、何が受信されたかを示すいくつかの部分文字列)
Jim Mischel 2013

@JimMischelええ、「/」が「\ /」に置き換えられていることに気づきました
Rohit Verma

@RohitVermaスラッシュが置き換えられるのは、生のHTMLコンテンツ(Fiddlerが教えてくれます)にあるのresult.Contentですか、それとも?これにより、問題がサーバーにあるのかクライアントにあるのかがわかります。
ジョーエノス2013

回答:


94

画像データの最初にヘッダー情報が含まれているかどうかを確認します。

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

これにより、上記のエラーが発生します。

最初のコンマを含む前のすべてを削除するだけで、準備完了です。

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

1
どういうわけかこの正確な問題がありました。ロジックは、存在する,場合data:はすべてを削除することです。バム。今働いています。
Maxime Rouiller 2016年

var cleanerBase64 = imageCode.Substring(22); // data:image / png; base64を削除
mejiamanuel57 2018年

3
役立つコードのほんの少し...... if(this.imageCode.Contains( '、'))this.imageCode = this.imageCode.Substring(this.imageCode.IndexOf( "、")+ 1 this.imageCode.Length-(this.imageCode.IndexOf( "、")+ 1));
TobySimmerling19年

私が使用します。.Split( '')[1]
Verthosa

1
str.Substring(str.LastIndexOf(',') + 1)それをする必要があります。
アリソン

65

非常に多分それは修正をBase64に変換ばかりだ+/文字がに変更されている-_http://en.wikipedia.org/wiki/Base64#Implementations_and_historyを参照してください

その場合は、元に戻す必要があります。

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

1
私はこれを成し遂げました....ありがとう!文字を適切なものに置き換えます。しかし、これは具体的な解決策ですか?つまり、すべてのファイルについて、これが置き換えられる文字になることをどのように保証できますか?
Rohit Verma 2013

2
@RohitVerma:わかりません。それらの文字がどこで変更されているかを調べ、他の文字が変更される可能性があるかどうかを判断する必要があります。私はRestSharpに精通していないので、そこでアドバイスを提供することはできません。私の回答があなたの質問に答えた場合、それを受け入れられた回答としてマークするのが通例です。(左側の回答の横にあるチェックマークをクリックしてください。)
Jim Mischel 2013

OMGありがとうございます!これと必要なパディング "="文字を追加することで私の問題は解決しました。AzureのKeyVault REST APIの復号化機能にはこのプロセスが必要であり、文書化されていません。
used2could

33

値の前にある不要な文字列入力を削除できます。

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

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

この解決策は私のために働いた。しかし、これは特にpng画像用です。あらゆる種類の画像拡張子を置き換える一般化された構文はありますか?
カランデサイ2016

1
私は今あなたのコメントを読みました。私はこれを試しませんが、これを使用できます:hdnImage.Replace( "data:image / png; base64、"、String.Empty).Replace( "data:image / jpg; base64、"、String.Empty).Replace( "data:image / bmp; base64、"、String.Empty); 繰り返しますが、私はこれを試しません。私のために書いてみてください。変わります。
ハサンマグロOruç

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]);

分割してリストに追加しますか?IndexOfと部分文字列を使用する
Emmanuel Gleizer 2018年


4

文字列をJSONとして返すため、その文字列には、生の応答に開始引用符と終了引用符が含まれます。したがって、応答はおそらく次のようになります。

"abc123XYZ=="

または何でも... Fiddlerでこれを確認してみてください。

私の推測では、result.Contentは引用符を含む生の文字列です。その場合は、result.Content使用する前に逆シリアル化する必要があります。


正解です。これには「」が含まれますが、ここでのポイントは、これらの引用符の追加とは別に、他の文字も置き換えられるということです。
Rohit Verma 2013

JSONシリアライザーを使用してその文字列を逆シリアル化すると、引用符とエスケープされたスラッシュの両方が処理されます。バックスラッシュでスラッシュをエスケープすることは、一部のJSONシリアライザーが行うことです。デシリアライザーを使用すると、\ /が単純な/に戻り、有効なbase-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);

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

7
このコードは問題を解決するかもしれませんが、良い答えは、コードが何をするの、そしてそれがどのように役立つのかも説明するはずです。
BDL

2

正規表現を使用して不要な文字列を削除します

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

1

アレックスFilipoviciが言及した問題は、間違ったエンコーディングでした。私が読み込んだファイルUTF-8-BOMは、上記のエラーをにスローしましたConvert.FromBase64String()。に変更しUTF-8ても問題なく動作しました。


1

また、二重引用符で始まる場合もあります。ほとんどの場合、ファイルを取得するためにdotNetCore2からAPIを呼び出します。

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

1
] [文字列からバイトに変換できません
Urasquirrel

1

おそらく、文字列はこのdata:image/jpeg;base64,/9j/4QN8RXh... 最初の分割のように/なり、2番目のトークンを取得します。

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.