如何使用Web API Get方法返回图像

本文关键字:方法 返回 图像 Get API 何使用 Web | 更新日期: 2023-09-27 18:04:20

我需要用Web API Get方法返回一个图像。下面的代码似乎工作得很好,除了我在Fiddler的ImageView窗口中得到这个消息,"这个响应是编码的,但不声称是一个图像。"

public HttpResponseMessage Get()
{
    using (FileStream fs = new FileStream(filePath, FileMode.Open))
    {
        HttpResponseMessage response = new HttpResponseMessage(); 
        response.Content = new StreamContent(fs);
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
        return response;
    }
} 

我在Fiddler中看到了相同的结果,代码也如下:

public HttpResponseMessage Get()
{
    HttpResponseMessage response = new HttpResponseMessage();
    Byte[] b = (GetImageByteArray());
    response.Content = new ByteArrayContent(b);
    response.Content.LoadIntoBufferAsync(b.Length).Wait();
    response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg");
    return response;
}

如果我使用。png格式,我得到相同的结果。

谢谢你的帮助,

如何使用Web API Get方法返回图像

如果我理解正确,那么你是问具体到asp.net核心。在ASP.net core中,HttpResponseMessage不是我们在ASP.net web api 2中使用的返回结果的方式。

在asp.net core (WEB API)中就像这样。

[HttpGet]
public IActionResult Get()
{            
    Byte[] b = System.IO.File.ReadAllBytes(@"E:''Test.jpg");   // You can use your own method over here.         
    return File(b, "image/jpeg");
}

注意:正如你提到的,在Fiddler Imageview中,你会看到这样的消息"他的响应是编码的,但不声称是图像",因为ASP.net核心考虑HttpResponseMessage作为简单的类并转换为json或xml。

这是我在我的项目中从API获取图像的方式。我为谁分享关心。

图片内容保存到服务器的Images文件夹,图片名称保存到数据库。

[Route("api/dashboard/GetImage")]
public byte[] GetImage(int componentId)
{
            using (var dashboardService = new DashboardService())
            {
                var component = dashboardService.GetImage(componentId);
                var context = HttpContext.Current;
                string filePath = context.Server.MapPath("~/Images/" + component.ImageName);
                context.Response.ContentType = "image/jpeg";
                using (FileStream fileStream = new FileStream(filePath, FileMode.Open))
                {
                    using (var memoryStream = new MemoryStream())
                    {
                        fileStream.CopyTo(memoryStream);
                        Bitmap image = new Bitmap(1, 1);
                        image.Save(memoryStream, ImageFormat.Jpeg);
                        byte[] byteImage = memoryStream.ToArray();
                        return byteImage;
                    }
                }
            }
}

获取Angular中的图像内容

this.dashboardService.getImage(this.componentId)
    .subscribe((blob: any) => {
      let objectURL = 'data:image/jpeg;base64,' + blob;
      this.imageUrl = this.sanitizer.bypassSecurityTrustUrl(objectURL);;
});

添加这个答案是因为这些注释很容易被忽略(就像我差点那样)。

由Jussi Palo建议(使用PhysicalFileResult):

[HttpGet]
public IActionResult Get()
{        
    return PhysicalFile(@"E:''Test.jpg", "image/jpeg");
}
  • 一个很好的单行程序,可以处理像206 partial这样的东西。

Tseng建议(使用FileContentResult构造函数的重载来接受一个流):

[HttpGet]
public IActionResult Get()
{        
    FileStream stream = File.Open(@"E:''Test.jpg");
    return File(stream, "image/jpeg");
}
  • 如果你的流来自其他地方(如嵌入式资源),

对于RL,记得检查文件/资源是否存在,如果不存在则返回404。

除了前面的答案之外,还可以使用此方法获取基于System.Web.Hosting命名空间内托管环境的映像。

var imageUrl = HostingEnvironment.MapPath("~/images/photo.png");

,用imageUrl找到图像的byte[],用image/jpeg等合适的内容类型进行处理

byte[] binaryImage = File.ReadAllBytes(imageUrl);   
return File(binaryImage , "image/jpeg");

确保你已经引用了System。文件静态方法的IO命名空间