今天有个场景需要webapi返回给客户端回应一个图片,以前的老套路不能用了。刚开始以为是需要使用“HttpResponseMessage“,直接使用HttpResponseMessage输出文件流
[HttpGet]
[Route("get")]
public HttpResponseMessage Get()
{
string path = @"C:\Users\***\Desktop\img0a28a1cbc674acd370585883abba3172.jpg";
HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.OK);
var bytes = GetIMGbyte(path);
message.Content = new ByteArrayContent(bytes);
message.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg");
message.Content.Headers.ContentLength = bytes.Length;
return message;
}
当我在浏览器中调用此终结点时,.Net Core 下 Web API会将HttpResponseMessage的
HTTP内容标头设置为,以JSON形式返回application/json
。
原因分析:
在dnx或者是asp.net core的webapi里面,如果要返回一个图片,需要返回一个IActionResult类型的,因为这两个的框架把HttpResponseMessage 当成一个model来处理的,所以使用HttpResponseMessage 始终返回Json
{
"version":{
"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1,"minorRevision":-1
},
"content":{
"headers":[
{"Key":"Content-Type","Value":["image/jpg"]},
{"Key":"Content-Length","Value":["206371"]}
]
},
"statusCode":200,"reasonPhrase":"OK","headers":[],"trailingHeaders":[],"requestMessage":null,"isSuccessStatusCode":true
}
解决办法:
您可以使用以下方法返回FileResult:
1:返回FileContentResult
[HttpGet]
[Route("get2")]
public async Task<FileContentResult> GetFiel()
{
string path = @"C:\Users\admin\Desktop\hk\img0a28a1cbc674acd370585883abba3172.jpg";
var mimeType = "image/jpg";
var bytes = GetIMGbyte(path);
return new FileContentResult(bytes, mimeType){
FileDownloadName = "1.jpg"
//如果设置了FileDownloadName ,则浏览器会直接下载该文件,不设置则浏览器会直接显示图片
};
}
private byte[] GetIMGbyte(string PicturePath)
{
//将需要存储的图片读取为数据流
FileStream fs = new FileStream(PicturePath, FileMode.Open, FileAccess.Read);
Byte[] btye2 = new byte[fs.Length];
fs.Read(btye2, 0, Convert.ToInt32(fs.Length));
fs.Close();
return btye2;
}
2:返回FileStreamResult
[HttpGet]
[Route("get3")]
public async Task<FileStreamResult> GetFiel3()
{
string path = @"C:\Users\admin\Desktop\hk\img0a28a1cbc674acd370585883abba3172.jpg";
var stream = new FileStream(path, FileMode.Open);
var mimeType = "image/jpg";
return new FileStreamResult(stream, mimeType) {
FileDownloadName = "1.jpg"
//如果设置了FileDownloadName ,则浏览器会直接下载该文件,不设置则浏览器会直接显示图片
};
}
参考资料:Return file in ASP.Net Core Web API