C# 输入不是有效的Base-64字符串,因为它包含非Base 64字符
我有一个REST服务,它读取一个文件,并在将其转换为字节数组和Base64字符串后将其发送到另一个控制台应用程序。这部分工作正常,但当应用程序接收到相同的流时,它会被操纵,不再是有效的Base64字符串。一些垃圾角色被引入到流中 将流转换回字节时收到的异常为 输入不是有效的Base-64字符串,因为它包含非Base-64字符串 字符、两个以上的填充字符或非空白 填充字符中的字符 服务时:C# 输入不是有效的Base-64字符串,因为它包含非Base 64字符,c#,file-io,base64,C#,File Io,Base64,我有一个REST服务,它读取一个文件,并在将其转换为字节数组和Base64字符串后将其发送到另一个控制台应用程序。这部分工作正常,但当应用程序接收到相同的流时,它会被操纵,不再是有效的Base64字符串。一些垃圾角色被引入到流中 将流转换回字节时收到的异常为 输入不是有效的Base-64字符串,因为它包含非Base-64字符串 字符、两个以上的填充字符或非空白 填充字符中的字符 服务时: [WebGet(UriTemplate = "ReadFile/Convert", ResponseForm
[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);
var imageParts = model.ImageAsString.Split(',').ToList<string>();
//Exclude the header from base64 by taking second element in List.
byte[] Image = Convert.FromBase64String(imageParts[1]);
在应用程序中:
[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);
var imageParts = model.ImageAsString.Split(',').ToList<string>();
//Exclude the header from base64 by taking second element in List.
byte[] Image = Convert.FromBase64String(imageParts[1]);
很可能它正在转换为一个修改过的Base64,其中
+
和/
字符被更改为-
和
。看
如果是这种情况,您需要将其更改回:
string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');
由于返回的字符串是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);
检查图像数据开头是否包含某些标题信息:
imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
这将导致上述错误
只要删除前面的所有内容,包括第一个逗号,就可以开始了
imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
我们可以删除值前面不必要的字符串输入
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty);
byte[] image64 = Convert.FromBase64String(convert);
以防您不知道上传图像的类型,只需删除其
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);
var imageParts = model.ImageAsString.Split(',').ToList<string>();
//Exclude the header from base64 by taking second element in List.
byte[] Image = Convert.FromBase64String(imageParts[1]);
var-imageParts=model.ImageAsString.Split(',').ToList();
//通过获取列表中的第二个元素,从base64中排除标头。
字节[]Image=Convert.FromBase64String(imageParts[1]);
如前所述,问题是编码错误。我读入的文件是UTF-8-BOM
,并在Convert.FromBase64String()
上抛出了上述错误。更改为UTF-8
没有问题。有时它以双引号开始,
大多数情况下,当您从dotNetCore 2调用API以获取文件时
string string64 = string64.Replace(@"""", string.Empty);
byte[] bytes = Convert.ToBase64String(string64);
字符串可能如下所示:data:image/jpeg;base64,/9j/4QN8RXh… 第一次拆分为
/
,并获取第二个令牌
var StrAfterSlash = Face.Split('/')[1];
然后拆分为;
,并获取第一个标记,它将是格式。在我的例子中,它是jpeg
var ImageFormat =StrAfterSlash.Split(';')[0];
然后删除收集的格式的行data:image/jpeg;base64,
CleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
通过正则表达式删除不必要的字符串
Regex regex=new Regex(@"^[\w/\:.-]+;base64,");
base64File=regex.Replace(base64File,string.Empty);
我之所以出现此错误,是因为sqlserver表中的字段是varbinary,而不是varchar,这可能与
编码有关。您知道插入了什么“垃圾字符”吗?更新的代码很有用。现在我们需要查看您发送的字符串(即服务上的s
)和接收的内容(即result.content
。您不需要发布整个字符串,只需发布到第一个损坏的字符(或者,如果仍然太长,则发布一些显示发送内容和接收内容的子字符串)@JimMischel是的,我注意到“/”被替换为“\/”@RohitVerma,因为斜杠被替换了,是不是在原始HTML内容中(Fiddler会告诉你),或在result.Content
?中,这将告诉您问题是出在服务器还是客户端上。我完成了…多亏了您!!将字符替换为合适的字符。但这是一个具体的解决方案吗?我的意思是,我如何保证所有文件中的字符都将被替换?@RohitVerma:我不知道。您呢需要找出这些字符的更改位置,并确定是否可能更改任何其他字符。我不熟悉RestSharp,因此无法提供任何建议。如果我的回答回答了您的问题,通常会将其标记为已接受的答案。(单击左侧答案旁边的复选标记。)OMG谢谢!这和添加必要的填充“=”字符解决了我的问题。Azure的密钥库REST API中的解密函数需要此过程,并且没有记录它。您是正确的,这包括”"但这里的要点是,除了添加这些引号外,其他字符也被替换。使用JSON序列化程序反序列化该字符串将同时处理引号和转义斜杠。使用反斜杠转义正斜杠是一些JSON序列化程序所做的事情-使用反序列化程序将导致\/返回到纯文本/以便获得有效的base-64。因为您正在接收JSON,所以正确解析该JSON始终是一个好主意,即使它只是一个简单的字符串。不知何故,有这个确切的问题。逻辑是删除之后的所有内容,如果数据:
存在。Bam.Working now.var cleanerBase64=imageCode.Substring(22);//删除数据:image/png;base64只要一点代码就可以了……如果(this.imageCode.Contains(','))this.imageCode=this.imageCode.Substring(this.imageCode.IndexOf(',')+1,this.imageCode.Length-(this.imageCode.IndexOf(',')+1)),我会使用:.Split(',')[1]str.Substring(str.LastIndexOf(',')+1)
应该可以。这个解决方案对我很有效。但这是专门针对png图像的。有什么通用的吗