IT TIP

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

itqueen 2020. 10. 31. 10:20
반응형

입력이 기본 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);

으로 알렉스 Filipovici이 언급 한 문제는 잘못된 인코딩이었다. 내가 읽은 파일 UTF-8-BOM은 위의 오류가 발생했습니다 Convert.FromBase64String(). UTF-8문제없이 작동하도록 변경했습니다 .


And some times it started with double quotes, most of the times when you call API from dotNetCore 2 for getting file

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

참고URL : https://stackoverflow.com/questions/15114044/the-input-is-not-a-valid-base-64-string-as-it-contains-a-non-base-64-character

반응형