입력이 기본 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);
'IT TIP' 카테고리의 다른 글
| for 루프에서 클릭 핸들러 할당 (0) | 2020.10.31 |
|---|---|
| 클래스의 공용 메서드에 대해 "사용되지 않음"경고 비활성화 (0) | 2020.10.31 |
| 난수 행렬을 만드는 간단한 방법 (0) | 2020.10.31 |
| DbSet없는 원시 SQL 쿼리-Entity Framework Core (0) | 2020.10.31 |
| 파이썬에서 sendmail을 통해 메일 보내기 (0) | 2020.10.31 |