我有一个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);
答案 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。