128

我有一个 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); 
4

13 回答 13

129

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

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

这将导致上述错误。

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

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
于 2015-05-29T09:22:17.800 回答
78

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

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

string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');
于 2013-02-27T14:09:43.370 回答
38

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

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

byte[] image64 = Convert.FromBase64String(convert);
于 2016-03-29T09:40:47.550 回答
9

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

Regex regex=new Regex(@"^[\w/\:.-]+;base64,");
base64File=regex.Replace(base64File,string.Empty);
于 2020-10-04T18:07:37.423 回答
6

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

"abc123XYZ=="

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

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

于 2013-02-27T14:42:41.690 回答
6

万一你不知道上传图片的类型,你只需要删除它的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]);
于 2017-08-23T13:37:20.960 回答
3

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

这是代码片段:

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);
于 2013-02-27T15:45:05.310 回答
3

可能字符串会像这样data:image/jpeg;base64,/9j/4QN8RXh... First split for/并获得第二个令牌。

var StrAfterSlash = Face.Split('/')[1];

然后拆分;并获取将成为格式的第一个标记。就我而言,它是jpeg。

var ImageFormat =StrAfterSlash.Split(';')[0];

然后删除data:image/jpeg;base64,收集格式的行

CleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
于 2020-09-25T10:57:16.630 回答
3
var spl = item.Split('/')[1];
var format =spl.Split(';')[0];           
stringconvert=item.Replace($"data:image/{format};base64,",String.Empty);
于 2020-04-06T08:05:42.613 回答
2

正如亚历克斯·菲利波维奇所说,这个问题是错误的编码。我读入的文件是UTF-8-BOM并在Convert.FromBase64String(). 更改为UTF-8确实没有问题。

于 2018-08-03T08:16:06.653 回答
1

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

string string64 = string64.Replace(@"""", string.Empty);
byte[] bytes = Convert.ToBase64String(string64);
于 2019-02-03T10:56:46.627 回答
0

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

于 2020-12-28T13:28:36.950 回答
0

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

// "........V/XeAeH/wALVWKtD8lz/AAAAABJRU5ErkJggg"
"........V/XeAeH/wALVWKtD8lz/AAAAABJRU5ErkJggg=="    /* yes */ 
于 2022-02-01T20:16:29.903 回答