【问题标题】:The input is not a valid Base-64 string as it contains a non-base 64 character输入不是有效的 Base64 字符串,因为它包含非 base 64 字符
【发布时间】:2013-02-27 14:04:18
【问题描述】:

我有一个 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 中?这将告诉您问题出在服务器还是客户端。

标签: c# file-io base64


【解决方案1】:

检查你的图片数据开头是否包含一些头部信息:

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) 应该这样做。
【解决方案2】:

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

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

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

【讨论】:

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

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

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);再次,我不尝试这个。请试着为我写信。我会改变的。
【解决方案4】:

通过Regex

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

【讨论】:

    【解决方案5】:

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

    "abc123XYZ=="
    

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

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

    【讨论】:

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

    【讨论】:

    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

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

      这里是sn-p的代码:

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

      【讨论】:

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

        【讨论】:

        • 虽然这段代码可能会解决问题,但一个好的答案还应该解释代码的什么以及它如何提供帮助。
        【解决方案10】:

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

        【讨论】:

          【解决方案11】:

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

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

          【讨论】:

          • 无法从字符串转换为字节[]
          【解决方案12】:

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

          【讨论】:

            【解决方案13】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-02-09
              • 2012-09-22
              • 1970-01-01
              • 2020-11-22
              • 2021-07-16
              相关资源
              最近更新 更多