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)
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)
Has*_*ruç 24
我们可以删除值前面不必要的字符串输入.
string convert = hdnImage.Replace("data:image/png;base64,", String.Empty);
byte[] image64 = Convert.FromBase64String(convert);
Run Code Online (Sandbox Code Playgroud)
以防万一你不知道上传的图片的类型,你只需要删除它的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)
字符串可能会像这样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)
通过Regex删除不必要的字符串
Regex regex=new Regex(@"^[\w/\:.-]+;base64,");
base64File=regex.Replace(base64File,string.Empty);
Run Code Online (Sandbox Code Playgroud)
由于您将字符串作为 JSON 返回,因此该字符串将在原始响应中包含开始和结束引号。所以你的回复应该是这样的:
"abc123XYZ=="
Run Code Online (Sandbox Code Playgroud)
或者其他什么......你可以尝试用 Fiddler 确认这一点。
我的猜测是result.Content
是原始字符串,包括引号。如果是这种情况,则result.Content
需要先反序列化才能使用它。