2013-02-27 200 views
48

ファイルを読み込んで別のコンソールアプリケーションに送信し、それをByte配列に変換してからBase64文字列に変換します。この部分は正しく行われますが、アプリケーションで同じストリームが受信されると、それは操作され、有効なBase64文字列ではなくなります。いくつかのジャンク文字がストリームに導入されています。入力は有効なBase-64文字列ではありません。ベース以外の64文字が含まれています。

ストリームをバイトに変換する際に例外が発生するのは、です。 "入力には、ベース以外の64文字、2文字以上のパディング文字、または非白色の文字が含まれているため、有効な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; 
    } 

:非常におそらくそれは+/文字が-_に変更されている修正をBase64に変換なってき

 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

。その場合はhttp://en.wikipedia.org/wiki/Base64#Implementations_and_history

を参照してください、あなたはそれをバックに変更する必要があります。

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

私はこれを済ませました。ありがとう! ! 文字を適切なものに置き換えてください。しかし、これは具体的な解決策ですか?つまり、すべてのファイルに対して、これは置き換えられる文字になることを保証することができますか? –

+1

@RohitVerma:わかりません。それらの文字がどこにあるのかを調べるそれが他の文字を変更する可能性があるかどうかを判断します。私はRestSharpに慣れていないので、私はそこに助言を提供することはできません。私の回答があなたの質問に答えた場合は、それを受け入れられた回答としてマークするのが通例です。 (左の答えの隣にあるチェックマークをクリックしてください) –

1

あなたはJSONとして文字列を返しているのでは、その文字列は、生の応答で開閉引用符が含まれます。あなたの応答はおそらく次のようになります:

"abc123XYZ==" 

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

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

+0

あなたは正しいですが、これには ""が含まれますが、ここでのポイントはこれらの引用符の追加以外に、他の文字も置き換えられます。 –

+0

JSONシリアライザを使用してその文字列を逆シリアル化すると、引用符とエスケープされたスラッシュの両方が処理されます。フォワードスラッシュをバックスラッシュでエスケープするのは、JSONシリアライザの中には、デシリアライザを使用することで有効なbase-64を得ることができるように、/プレーンのみに戻すものがあります。 JSONを受け取っているので、それが単なる文字列であっても、JSONを適切に解析することは常に良い考えです。 –

3

私はあなたが記述したのと同じような文脈を設定しました。私は同じエラーに直面しました。コンテンツの先頭と末尾から"を削除し、\//に置き換えて、問題なく動作させることができました。あなたは応答形式にXMLを使用して検討するかもしれない、別の方法として

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

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

:クライアント側で

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

ここ

は、コードスニペットです画像データに最初にいくつかのヘッダー情報が含まれていないか確認してください:

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

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

最初のカンマの前にあるすべてのものを削除してください。

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC... 
+0

何とかこの正確な問題がありました。 Logicは、 'data:'が存在すれば、 '、'の後ろのすべてを削除することです。 Bam。今働いている。 –

13

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

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

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

この解決策は私のために働いた。しかし、これは特にPNG画像用です。すべての種類の画像拡張子を置き換える一般化された構文はありますか? –

+0

あなたのコメントを今読んでいます。私はこれを試してみませんが、これを使用することができます:hdnImage.Replace( "data:image/png; base64、"、String.Empty).Replace( "data:image/jpg; base64、"、String.Empty).Replace "data:image/bmp; base64、"、String.Empty);もう一度、私はこれを試していない。私のために試してみてください。私は変更されます。 –

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

分割とリストへ? IndexOfとサブ文字列 –

+0

@EmmanuelGleizerを使用すると効率的ですか? –

+0

http://demeranville.com/battle-of-the-tokenizers-delimited-text-parser-performance/を参照してください。質問はこちらにも掲載されています:https://stackoverflow.com/questions/35388181/split-method- vs-substring-and-indexof –