ファイルを読み取り、バイト配列に変換してからBase64文字列に変換した後、別のコンソールアプリケーションに送信するRESTサービスがあります。この部分は正しく発生しますが、アプリケーションで同じストリームが受信されると、操作され、有効なBase64文字列ではなくなります。一部のジャンクキャラクターがストリームに導入されています。
ストリームをバイトに戻すときに取得する例外はパディング文字の中の文字」。
サービス中:
[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);
画像データの先頭にヘッダー情報が含まれているかどうかを確認します。
imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
これにより、上記のエラーが発生します。
最初のコンマの前と最初のコンマを含むすべてを削除するだけで、準備完了です。
imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
おそらく、+
および/
文字が-
および_
に変更された変更済みBase64に変換される可能性があります。 http://en.wikipedia.org/wiki/Base64#Implementations_and_history を参照してください
その場合は、元に戻す必要があります。
string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');
値の前にある不要な文字列入力を削除できます。
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty);
byte[] image64 = Convert.FromBase64String(convert);
あなたが説明したのと同様のコンテキストを配置し、同じエラーに直面しました。コンテンツの先頭と末尾から"
を削除し、\/
を/
に置き換えることで、なんとか動作させることができました。
コードスニペットは次のとおりです。
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);
文字列をJSONとして返すため、その文字列には生の応答に開始引用符と終了引用符が含まれます。したがって、応答はおそらく次のようになります。
"abc123XYZ=="
または何でも...あなたはFiddlerでこれを確認してみることができます。
私の推測では、result.Content
は引用符を含む生の文字列です。その場合は、使用する前にresult.Content
をデシリアライズする必要があります。
アップロードされた画像のタイプがわからない場合、その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]);
Alex Filipovici が指摘したように、この問題は間違ったエンコーディングでした。読み込んだファイルはUTF-8-BOM
で、Convert.FromBase64String()
で上記のエラーをスローしました。 UTF-8
への変更は問題なく機能しました。
また、二重引用符で始まることもありますが、ほとんどの場合、ファイルを取得するためにdotNetCore 2からAPIを呼び出します。
string string64 = string64.Replace(@"""", string.Empty);
byte[] bytes = Convert.ToBase64String(string64);