Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 输入不是有效的Base-64字符串,因为它包含非Base 64字符_C#_File Io_Base64 - Fatal编程技术网

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

C# 输入不是有效的Base-64字符串,因为它包含非Base 64字符,c#,file-io,base64,C#,File Io,Base64,我有一个REST服务,它读取一个文件,并在将其转换为字节数组和Base64字符串后将其发送到另一个控制台应用程序。这部分工作正常,但当应用程序接收到相同的流时,它会被操纵,不再是有效的Base64字符串。一些垃圾角色被引入到流中 将流转换回字节时收到的异常为 输入不是有效的Base-64字符串,因为它包含非Base-64字符串 字符、两个以上的填充字符或非空白 填充字符中的字符 服务时: [WebGet(UriTemplate = "ReadFile/Convert", ResponseForm

我有一个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); 
 var imageParts = model.ImageAsString.Split(',').ToList<string>();
 //Exclude the header from base64 by taking second element in List.
 byte[] Image = Convert.FromBase64String(imageParts[1]);
在应用程序中:

[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); 
 var imageParts = model.ImageAsString.Split(',').ToList<string>();
 //Exclude the header from base64 by taking second element in List.
 byte[] Image = Convert.FromBase64String(imageParts[1]);

很可能它正在转换为一个修改过的Base64,其中
+
/
字符被更改为
-
。看

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

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

由于返回的字符串是JSON,因此该字符串将在原始响应中包含开始和结束引号。因此,您的回答可能如下所示:

"abc123XYZ=="
或者随便什么…你可以试着和Fiddler确认一下


我猜,
result.Content
是原始字符串,包括引号。如果是这样的话,那么
result.Content
需要先进行反序列化,然后才能使用它。

我安排了与您描述的类似的上下文,遇到了相同的错误。通过从内容的开头和结尾删除
,并用
/
替换
\/
,我成功地使它工作起来

以下是代码片段:

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

检查图像数据开头是否包含某些标题信息:

imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...
这将导致上述错误

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

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

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

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

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

以防您不知道上传图像的类型,只需删除其
base64
标题:

[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); 
 var imageParts = model.ImageAsString.Split(',').ToList<string>();
 //Exclude the header from base64 by taking second element in List.
 byte[] Image = Convert.FromBase64String(imageParts[1]);
var-imageParts=model.ImageAsString.Split(',').ToList();
//通过获取列表中的第二个元素,从base64中排除标头。
字节[]Image=Convert.FromBase64String(imageParts[1]);

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

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

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

字符串可能如下所示: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);

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

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

我之所以出现此错误,是因为sqlserver表中的字段是varbinary,而不是varchar

,这可能与
编码有关。您知道插入了什么“垃圾字符”吗?更新的代码很有用。现在我们需要查看您发送的字符串(即服务上的
s
)和接收的内容(即
result.content
。您不需要发布整个字符串,只需发布到第一个损坏的字符(或者,如果仍然太长,则发布一些显示发送内容和接收内容的子字符串)@JimMischel是的,我注意到“/”被替换为“\/”@RohitVerma,因为斜杠被替换了,是不是在原始HTML内容中(Fiddler会告诉你),或在
result.Content
?中,这将告诉您问题是出在服务器还是客户端上。我完成了…多亏了您!!将字符替换为合适的字符。但这是一个具体的解决方案吗?我的意思是,我如何保证所有文件中的字符都将被替换?@RohitVerma:我不知道。您呢需要找出这些字符的更改位置,并确定是否可能更改任何其他字符。我不熟悉RestSharp,因此无法提供任何建议。如果我的回答回答了您的问题,通常会将其标记为已接受的答案。(单击左侧答案旁边的复选标记。)OMG谢谢!这和添加必要的填充“=”字符解决了我的问题。Azure的密钥库REST API中的解密函数需要此过程,并且没有记录它。您是正确的,这包括”"但这里的要点是,除了添加这些引号外,其他字符也被替换。使用JSON序列化程序反序列化该字符串将同时处理引号和转义斜杠。使用反斜杠转义正斜杠是一些JSON序列化程序所做的事情-使用反序列化程序将导致\/返回到纯文本/以便获得有效的base-64。因为您正在接收JSON,所以正确解析该JSON始终是一个好主意,即使它只是一个简单的字符串。不知何故,有这个确切的问题。逻辑是删除
之后的所有内容,如果
数据:
存在。Bam.Working now.var cleanerBase64=imageCode.Substring(22);//删除数据:image/png;base64只要一点代码就可以了……如果(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)
应该可以。这个解决方案对我很有效。但这是专门针对png图像的。有什么通用的吗