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

Roh*_*rma 71 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;
  }
Run Code Online (Sandbox Code Playgroud)

申请时:

       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); 
Run Code Online (Sandbox Code Playgroud)

ben*_*cko 63

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

imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Run Code Online (Sandbox Code Playgroud)

这将导致上述错误.

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

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
Run Code Online (Sandbox Code Playgroud)

  • 只需一点代码即可帮助...... if (this.imageCode.Contains(',')) this.imageCode = this.imageCode.Substring(this.imageCode.IndexOf(",") + 1, this.imageCode.Length - (this.imageCode.IndexOf(",") + 1)); (3认同)
  • 我会使用: .Split(',')[1] (3认同)
  • `str.Substring(str.LastIndexOf(',') + 1)` 应该可以做到。 (2认同)

Jim*_*hel 62

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

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

string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');
Run Code Online (Sandbox Code Playgroud)

  • @RohitVerma:我不知道.您需要找出这些字符发生变化的位置,并确定它是否可能更改任何其他字符.我不熟悉RestSharp,所以我不能在那里提供任何建议.如果我的回答回答了您的问题,则习惯上将其标记为已接受的答案.(单击左侧答案旁边的复选标记.) (2认同)

Has*_*ruç 24

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

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

byte[] image64 = Convert.FromBase64String(convert);
Run Code Online (Sandbox Code Playgroud)


Mah*_*tib 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]);
Run Code Online (Sandbox Code Playgroud)


Muh*_*ooq 6

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

var StrAfterSlash = Face.Split('/')[1];
Run Code Online (Sandbox Code Playgroud)

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

var ImageFormat =StrAfterSlash.Split(';')[0];
Run Code Online (Sandbox Code Playgroud)

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

CleanFaceData=Face.Replace($"data:image/{ImageFormat };base64,",string.Empty);
Run Code Online (Sandbox Code Playgroud)


Amr*_*afa 6

通过Regex删除不必要的字符串

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


Joe*_*nos 5

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

"abc123XYZ=="
Run Code Online (Sandbox Code Playgroud)

或者其他什么......你可以尝试用 Fiddler 确认这一点。

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