我有一个 REST 服务,它读取文件并将其转换为字节数组,然后转换为 Base64 字符串后将其发送到另一个控制台应用程序。这部分有效,但是当应用程序接收到相同的流时,它会被操纵并且不再是有效的 Base64 字符串。一些垃圾字符被引入流中。
将流转换回字节时收到的异常是
输入不是有效的 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);
Encoding
有关。
s
)和接收到的内容(即 result.content
。您不需要发布整个字符串,只需发布第一个错位字符(或,如果这仍然太长,一些子字符串会显示发送的内容和接收的内容)。
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);
通过正则表达式删除不必要的字符串
Regex regex=new Regex(@"^[\w/\:.-]+;base64,");
base64File=regex.Replace(base64File,string.Empty);
由于您将字符串作为 JSON 返回,因此该字符串将包括原始响应中的开始和结束引号。所以你的反应应该是这样的:
"abc123XYZ=="
或其他...您可以尝试使用 Fiddler 确认这一点。
我的猜测是 result.Content
是原始字符串,包括引号。如果是这种情况,则需要先对 result.Content
进行反序列化,然后才能使用它。
万一您不知道上传图片的类型,您只需删除其 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]);
字符串可能是这样的 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);
我安排了与您描述的类似的上下文,但遇到了同样的错误。我设法通过从内容的开头和结尾删除 "
并将 \/
替换为 /
来使其工作。
这是代码片段:
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);
var spl = item.Split('/')[1];
var format =spl.Split(';')[0];
stringconvert=item.Replace($"data:image/{format};base64,",String.Empty);
正如 Alex Filipovici 提到的,问题是编码错误。我读入的文件是 UTF-8-BOM
,并在 Convert.FromBase64String()
上抛出了上述错误。更改为 UTF-8
确实没有问题。
请检查是否没有 == 作为后缀,只需在字符串的最后添加 == 字符
// "........V/XeAeH/wALVWKtD8lz/AAAAABJRU5ErkJggg"
"........V/XeAeH/wALVWKtD8lz/AAAAABJRU5ErkJggg==" /* yes */
有时它以双引号开头,大多数时候你从 dotNetCore 2 调用 API 来获取文件
string string64 = string64.Replace(@"""", string.Empty);
byte[] bytes = Convert.ToBase64String(string64);
我收到此错误是因为 sqlserver 表中的字段是 varbinary 而不是 varchar。
data:
,逻辑是删除,
之后的所有内容。巴姆。现在工作。str.Substring(str.LastIndexOf(',') + 1)
应该这样做。