input不是有效的Base-64string,因为它包含非基本的64个字符

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

我将stream转换回字节时得到的exception是“input不是有效的Base-64string,因为它包含非基本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); 

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

如果是这样的话,你需要把它改回来:

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

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

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

这将导致上述错误。

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

 imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC... 

我们可以删除前面的不必要的stringinput。

 string convert = hdnImage.Replace("data:image/png;base64,", String.Empty); byte[] image64 = Convert.FromBase64String(convert); 

我按照你的描述安排了一个类似的背景,我面临着同样的错误。 我设法通过删除"从内容的开始和结束,并通过\/ /取代\/ /

这里是代码片段:

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

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

 "abc123XYZ==" 

或任何…你可以尝试确认这与提琴手。

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

以防万一你不知道上传的图像的types,你只需要删除它的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]);