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

时间:2013-02-27 14:04:18

标签: c# file-io base64

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

将流转换回Byte时得到的异常是“输入不是有效的Base-64字符串,因为它包含非基本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); 

12 个答案:

答案 0 :(得分:54)

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

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

这将导致上述错误。

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

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

答案 1 :(得分:53)

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

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

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

答案 2 :(得分:21)

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

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

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

答案 3 :(得分: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);

答案 4 :(得分:3)

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

答案 5 :(得分:2)

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

"abc123XYZ=="

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

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

答案 6 :(得分:2)

万一您不知道上传图片的类型,只需删除其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]);

答案 7 :(得分:2)

通过 Regex

删除不必要的字符串
Regex regex=new Regex(@"^[\w/\:.-]+;base64,");
base64File=regex.Replace(base64File,string.Empty);

答案 8 :(得分: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);

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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

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

答案 11 :(得分:0)

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