[c#] 입력이 기본 64가 아닌 문자를 포함하므로 유효한 Base-64 문자열이 아닙니다.

파일을 읽고 Byte 배열로 변환 한 다음 Base64 문자열로 변환 한 후 다른 콘솔 응용 프로그램으로 보내는 REST 서비스가 있습니다. 이 부분은 작동하지만 동일한 스트림이 애플리케이션에서 수신되면 조작되고 더 이상 유효한 Base64 문자열이 아닙니다. 일부 정크 캐릭터가 스트림에 소개되고 있습니다.

스트림을 다시 Byte로 변환 할 때 수신 된 예외는 다음과 같습니다.

입력이 기본 64가 아닌 문자, 두 개 이상의 채우기 문자 또는 채우기 문자 사이에 공백이 아닌 문자를 포함하므로 유효한 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);



답변

처음에 이미지 데이터에 헤더 정보가 포함되어 있는지 확인하세요.

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


답변

업로드 된 이미지의 유형을 모르고 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]);


답변

문자열을 JSON으로 반환하므로 해당 문자열에는 원시 응답에 여는 따옴표와 닫는 따옴표가 포함됩니다. 따라서 응답은 다음과 같을 것입니다.

"abc123XYZ=="

또는 무엇이든 … Fiddler로 이것을 확인해 볼 수 있습니다.

내 생각 엔 result.Content따옴표를 포함한 원시 문자열입니다. 이 경우 result.Content사용하기 전에 역 직렬화해야합니다.


답변

나는 당신이 설명한 것과 비슷한 맥락을 정리했고 같은 오류에 직면했습니다. "내용의 시작과 끝 부분 을 제거 하고 다음으로 대체 \/하여 작동하도록 관리했습니다./ .

다음은 코드 조각입니다.

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


답변

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