128

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

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

入力は有効な Base-64 文字列ではありません。base 64 以外の文字、3 つ以上の埋め込み文字、または埋め込み文字の中に空白以外の文字が含まれているためです。

サービス中:

[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

13 に答える 13

129

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

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

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

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

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
于 2015-05-29T09:22:17.800 に答える
78

+および/文字が および に変更され-た、変更された Base64 に変換されている可能性が非常に高い_です。http://en.wikipedia.org/wiki/Base64#Implementations_and_historyを参照

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

string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');
于 2013-02-27T14:09:43.370 に答える
38

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

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

byte[] image64 = Convert.FromBase64String(convert);
于 2016-03-29T09:40:47.550 に答える
9

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

Regex regex=new Regex(@"^[\w/\:.-]+;base64,");
base64File=regex.Replace(base64File,string.Empty);
于 2020-10-04T18:07:37.423 に答える
6

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

"abc123XYZ=="

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

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

于 2013-02-27T14:42:41.690 に答える
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);
于 2013-02-27T15:45:05.310 に答える
3

おそらく、文字列は次のようになります。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);
于 2020-09-25T10:57:16.630 に答える
3
var spl = item.Split('/')[1];
var format =spl.Split(';')[0];           
stringconvert=item.Replace($"data:image/{format};base64,",String.Empty);
于 2020-04-06T08:05:42.613 に答える