如何使用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格式,我得到相同的结果。
谢谢你的帮助,
如果我理解正确,那么你是问具体到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命名空间