ChatGPT解决这个技术问题 Extra ChatGPT

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

我有一个 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。您不需要发布整个字符串,只需发布第一个错位字符(或,如果这仍然太长,一些子字符串会显示发送的内容和接收的内容)。
@JimMischel 是的,我注意到 '/' 被替换为 '\/'
@RohitVerma 对于被替换的斜线,是在原始 HTML 内容中(Fiddler 会告诉你)还是在 result.Content 中?这将告诉您问题出在服务器还是客户端。

b
bendecko

检查您的图像数据是否在开头包含一些标题信息:

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

这将导致上述错误。

只需删除前面的所有内容,包括第一个逗号,就可以了。

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

不知何故有这个确切的问题。如果存在 data:,逻辑是删除 , 之后的所有内容。巴姆。现在工作。
var cleanBase64 = imageCode.Substring(22); // 删除数据:image/png;base64
只需一点代码来帮助...... if (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) 应该这样做。
J
Jim Mischel

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

如果是这种情况,您需要将其改回:

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

我搞定了……谢谢你!!用适当的字符替换字符。但这是一个具体的解决方案吗?我的意思是我如何保证对于所有文件,这将是要替换的字符?
@RohitVerma:我不知道。您需要找出这些字符发生变化的位置,并确定它是否可能更改任何其他字符。我不熟悉 RestSharp,所以我不能在那里提供任何建议。如果我的回复回答了您的问题,通常会将其标记为已接受的答案。 (单击左侧答案旁边的复选标记。)
天哪,谢谢!这并添加必要的填充“=”字符解决了我的问题。 Azure 的 Key Vault REST API 中的解密函数需要这个过程,并且没有记录它。
H
Hasan Tuna Oruç

我们可以去掉值前面不必要的字符串输入。

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

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

这个解决方案对我有用。但这是专门针对 png 图像的。是否有任何通用语法可以替换各种图像扩展?
我现在读了你的评论。我不尝试这个,但你可以使用这个: hdnImage.Replace("data:image/png;base64,", String.Empty).Replace("data:image/jpg;base64,", String.Empty).Replace( “数据:图像/bmp;base64,”,String.Empty);再次,我不尝试这个。请试着为我写信。我会改变的。
A
Amro Mustafa

通过正则表达式删除不必要的字符串

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

J
Joe Enos

由于您将字符串作为 JSON 返回,因此该字符串将包括原始响应中的开始和结束引号。所以你的反应应该是这样的:

"abc123XYZ=="

或其他...您可以尝试使用 Fiddler 确认这一点。

我的猜测是 result.Content 是原始字符串,包括引号。如果是这种情况,则需要先对 result.Content 进行反序列化,然后才能使用它。


你是对的,这包括“”但这里的重点是,除了这些引号之外,其他字符也被替换了。
使用 JSON 序列化程序反序列化该字符串将同时处理引号和转义的斜杠。使用反斜杠转义正斜杠是一些 JSON 序列化程序所做的事情 - 使用反序列化程序会将 \/ 转换回纯 / 以便您获得有效的 base-64。由于您正在接收 JSON,因此正确解析该 JSON 始终是一个好主意,即使它只是一个简单的字符串。
M
Mahdi Alkhatib

万一您不知道上传图片的类型,您只需删除其 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 和 substring
请参阅 demeranville.com/…,该问题也发布在此处:stackoverflow.com/questions/35388181/…
D
DevLoverUmar

字符串可能是这样的 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);

A
Alex Filipovici

我安排了与您描述的类似的上下文,但遇到了同样的错误。我设法通过从内容的开头和结尾删除 " 并将 \/ 替换为 / 来使其工作。

这是代码片段:

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

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

尽管此代码可能会解决问题,但一个好的答案还应该解释代码的作用以及它如何提供帮助。
t
testing

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


M
Mucahid Uslu

请检查是否没有 == 作为后缀,只需在字符串的最后添加 == 字符

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

u
user193679

有时它以双引号开头,大多数时候你从 dotNetCore 2 调用 API 来获取文件

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

无法从字符串转换为字节 []
M
M Komaei

我收到此错误是因为 sqlserver 表中的字段是 varbinary 而不是 varchar。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅