输入不是有效的 Base-64字符串,因为它包含非基64字符

我有一个 REST 服务,它读取一个文件,并将其转换为字节数组后发送到另一个控制台应用,然后再转换为 Base64字符串。这部分可以工作,但是当应用程序接收到相同的流时,它将被操作,不再是有效的 Base64字符串。一些垃圾字符正在被引入流中。

将流转换回 Byte 时收到的异常为

输入不是有效的 Base-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);
401851 次浏览

它很有可能被转换为修改后的 Base64,其中 +/字符被更改为 -_。见 http://en.wikipedia.org/wiki/Base64#Implementations_and_history

如果是这样的话,你需要把它改回来:

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头:

 var imageParts = model.ImageAsString.Split(',').ToList<string>();
//Exclude the header from base64 by taking second element in List.
byte[] Image = Convert.FromBase64String(imageParts[1]);

正如 Alex Filipovici提到的,这个问题是一个错误的编码。我读入的文件是 UTF-8-BOM,并在 Convert.FromBase64String()上抛出上述错误。改用 UTF-8确实没有问题。

有时候开头是双引号, 大多数情况下,从 dotNetCore2调用 API 获取文件

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

可能字符串是这样的 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表中是 Varbiny而不是 Varchar

请检查是否有后缀 = = , 最后加上 = = 字符

// "........V/XeAeH/wALVWKtD8lz/AAAAABJRU5ErkJggg"
"........V/XeAeH/wALVWKtD8lz/AAAAABJRU5ErkJggg=="    /* yes */