Asp.Net Core下HttpResponseMessage输出文件前端始终输出Json

    技术2022-09-02  104

    今天有个场景需要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

     

    Processed: 0.011, SQL: 9