从Asp.Net Core WebAPI返回jpeg图像

时间:2016-11-24 20:47:20

标签: asp.net-core content-type asp.net-core-webapi

使用 asp.net core web api ,我想让我的控制器操作方法返回 jpeg图像流
在我当前的实现中,浏览器仅显示json字符串。 我的期望是在浏览器中看到图像。

在使用chrome开发人员工具进行调试时,我发现内容类型仍然是

Content-Type:application/json; charset=utf-8

在响应标题中返回,即使在我的代码中我手动将内容类型设置为" image / jpeg"。

寻找解决方案我的Web API如下

    [HttpGet]
    public async Task<HttpResponseMessage> Get()
    {
        var image = System.IO.File.OpenRead("C:\\test\random_image.jpeg");
        var stream = new MemoryStream();

        image.CopyTo(stream);
        stream.Position = 0;            
        result.Content = new StreamContent(image);
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        result.Content.Headers.ContentDisposition.FileName = "random_image.jpeg";
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
        result.Content.Headers.ContentLength = stream.Length;

        return result;
    }

enter image description here

4 个答案:

答案 0 :(得分:47)

清洁解决方案使用FilestreamResult !!

[HttpGet]
public async Task<IActionResult> Get()
{
    var image = System.IO.File.OpenRead("C:\\test\\random_image.jpeg");
    return File(image, "image/jpeg");
}

说明:

在ASP.NET Core中,您必须在Controller中使用内置 File()方法。这将允许您手动设置内容类型。

不要像以前在ASP.NET Web API 2中使用那样创建和返回HttpResponseMessage。它不会做任何事情,甚至不会抛出错误!

答案 1 :(得分:4)

PhysicalFile使用简单的语法帮助从Asp.Net Core WebAPI返回文件

    [HttpGet]
    public IActionResult Get(int imageId)
    {            
       return new PhysicalFile(@"C:\test.jpg", "image/jpeg");
    }

答案 2 :(得分:0)

在我的情况下,我使用的是图片的相对路径,因此以下是我的可行解决方案

[HttpGet]
public async Task<IActionResult> Get()
{
    var url = "/content/image.png";
    var path = GetPhysicalPathFromURelativeUrl(url);
    return PhysicalFile(image, "image/png");
}
public string GetPhysicalPathFromRelativeUrl(string url)
{            
    var path = Path.Combine(_host.Value.WebRootPath, url.TrimStart('/').Replace("/", "\\"));
    return path;
}

答案 3 :(得分:-6)

[HttpGet("Image/{id}")]
    public IActionResult Image(int id)
    {
        if(id == null){ return NotFound(); }
        else{

            byte[] imagen = "@C:\\test\random_image.jpeg";
            return File(imagen, "image/jpeg");
        }
    }