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


101

파일을 읽고 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); 

4
아마도 이것은 Encoding.
Alex Filipovici

1
삽입되는 "정크 문자"가 무엇인지 알고 있습니까?
Jim Mischel 2013

업데이트 된 코드가 도움이됩니다. 이제 우리는 당신이 보낸 문자열 (즉 s, 서비스에서)과받은 내용을 result.content볼 필요가 있습니다 (예 : . 전체 문자열을 게시 할 필요가 없습니다. 첫 번째 문자까지만 게시 할 필요가 없습니다 (또는 여전히 너무 긴 경우). , 전송 된 내용과 수신 된 내용을 보여주는 일부 하위 문자열).
Jim Mischel 2013-02-27

@JimMischel 예, '/'가 '\ /'로 바뀌는 것을 발견했습니다
Rohit 베르

@RohitVerma 슬래시가 대체되는 경우 원시 HTML 콘텐츠 (Fiddler가 알려줍니다) 또는 result.Content? 문제가 서버에 있는지 아니면 클라이언트에 있는지 알려줍니다.
Joe Enos 2013

답변:


97

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

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

이로 인해 위의 오류가 발생합니다.

첫 번째 쉼표를 포함하여 앞의 모든 항목을 제거하기 만하면됩니다.

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

1
이 정확한 문제가 어떻게 든 있었습니까? 논리는 존재 ,한다면 모든 것을 제거하는 것 data:입니다. Bam. 지금 일하고 있습니다.
막심 Rouiller

var cleanerBase64 = imageCode.Substring (22); // 데이터 제거 : image / png; base64
mejiamanuel57

3
도움이되는 약간의 코드 ...... if (this.imageCode.Contains ( ',')) this.imageCode = this.imageCode.Substring (this.imageCode.IndexOf ( ",") + 1, this.imageCode.Length-(this.imageCode.IndexOf ( ",") + 1));
Toby Simmerling 19.

내가 사용하는 것이 : .Split를 ( '') [1]
Verthosa

1
str.Substring(str.LastIndexOf(',') + 1)해야합니다.
Alisson

65

아주 아마도 그것은 수정 된 Base64로, 변환 점점 +/문자로 변경 -하고 _. http://en.wikipedia.org/wiki/Base64#Implementations_and_history 참조

이 경우 다시 변경해야합니다.

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

1
내가 해냈어 .... 감사합니다 !! 문자를 적절한 문자로 바꿉니다. 그러나 이것이 구체적인 해결책입니까? 나는 모든 파일에 대해 이것이 대체 될 문자가 될 것이라고 어떻게 보장 할 수 있습니까?
Rohit Verma

2
@RohitVerma : 모르겠어요. 해당 문자가 어디에서 변경되는지 확인하고 다른 문자를 변경할 가능성이 있는지 확인해야합니다. RestSharp에 익숙하지 않아서 조언을 드릴 수 없습니다. 내 답변이 귀하의 질문에 답변했다면 수락 된 답변으로 표시하는 것이 일반적입니다. (왼쪽 답변 옆에있는 확인 표시를 클릭하십시오.)
Jim Mischel 2013

감사합니다! 이것과 필요한 패딩 "="문자를 추가하면 내 문제가 해결되었습니다. Azure의 Key Vault REST API의 암호 해독 기능에는이 프로세스가 필요하며 문서화하지 않습니다.
used2could

33

값 앞에 불필요한 문자열 입력을 제거 할 수 있습니다.

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

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

이 솔루션은 저에게 효과적이었습니다. 그러나 이것은 특히 png 이미지를위한 것입니다. 모든 종류의 이미지 확장자를 대체하는 일반화 된 구문이 있습니까?
Karan Desai

1
나는 지금 당신의 코멘트를 읽었습니다. 나는 이것을 시도하지 않지만 이것을 사용할 수 있습니다 : hdnImage.Replace ( "data : image / png; base64,", String.Empty) .Replace ( "data : image / jpg; base64,", String.Empty) .Replace ( "데이터 : 이미지 / bmp; base64,", String.Empty); 다시, 나는 이것을 시도하지 않는다. 저를 위해 써주세요. 나는 변할 것이다.
Hasan Tuna Oruç 2016 년

5

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

분할 및 목록으로? 사용하지 않고 같이 IndexOf와 문자열
엠마뉴엘 Gleizer

참조 demeranville.com/... 및 질문은 여기에 게시됩니다 : stackoverflow.com/questions/35388181/...
엠마뉴엘 Gleizer

4

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

"abc123XYZ=="

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

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


맞습니다. 여기에는 ""가 포함됩니다. 그러나 여기서 요점은 이러한 인용 부호를 추가하는 것 외에 다른 문자도 대체된다는 것입니다.
Rohit Verma

JSON 직렬 변환기를 사용하여 해당 문자열을 역 직렬화하면 따옴표와 이스케이프 된 슬래시가 모두 처리됩니다. 백 슬래시로 슬래시를 이스케이프하는 것은 일부 JSON 직렬 변환기가 수행하는 작업입니다. deserializer를 사용하면 \ / 다시 평범하게 / 그래서 유효한 base-64를 얻을 수 있습니다. JSON을 수신하고 있으므로 단순한 문자열 인 경우에도 JSON을 올바르게 구문 분석하는 것이 좋습니다.
Joe Enos

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

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

7
이 코드가 문제를 해결할 수 있지만 좋은 대답은 코드의 기능과 도움이되는 방법을 설명 해야 합니다 .
BDL

2

Regex를 통해 불필요한 문자열 제거

Regex regex=new Regex(@"^[\w/\:.-]+;base64,");
base64File=regex.Replace(base64File,string.Empty);

1

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


1

그리고 어떤 때는 큰 따옴표로 시작했습니다. 대부분 파일을 가져 오기 위해 dotNetCore 2에서 API를 호출 할 때

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

1
바이트 []에 문자열로 변환 할 수 없습니다
Urasquirrel

1

아마도 문자열은 다음과 같을 것입니다. data:image/jpeg;base64,/9j/4QN8RXh... First split for /and get the second token.

var StrAfterSlash = Face.Split('/')[1];

그런 다음 분할 ;하고 형식이 될 첫 번째 토큰을 가져옵니다. 제 경우에는 jpeg입니다.

var ImageFormat =StrAfterSlash.Split(';')[0];

그런 다음 줄을 제거하십시오 data:image/jpeg;base64, 수집 된 형식에 대한 을 합니다.

CleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.