Как вернуть изображение с помощью метода Web API Get
Мне нужно вернуть изображение с помощью метода 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.
Цените свою помощь,
Ответы
Ответ 1
Если я правильно понял, вы задаете вопрос о ядре asp.net. В ядре ASP.net HttpResponseMessage не является способом вернуть результат так, как мы это делали в ASP.net web api 2.
В ядре asp.net(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.
Ответ 2
Так я получаю изображение из API в моем проекте. Я разделяю, для кого беспокойство.
Содержимое изображения сохраняется в папке "Изображения" на сервере, а имя изображения сохраняется в базе данных.
[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);;
});
Ответ 3
Добавление этого ответа, потому что эти комментарии легко пропустить (как я почти сделал).
Предложено Юсси Пало (с использованием PhysicalFileResult):
[HttpGet]
public IActionResult Get()
{
return PhysicalFile(@"E:\\Test.jpg", "image/jpeg");
}
- Хороший единственный лайнер, который обрабатывает вещи как 206 частичных.
Предложено Tseng (с использованием перегрузки конструктора FileContentResult, который принимает поток):
[HttpGet]
public IActionResult Get()
{
FileStream stream = File.Open(@"E:\\Test.jpg");
return File(stream, "image/jpeg");
}
- Полезно, если ваш поток идет откуда-то еще (например, встроенный ресурс).
Для RL не забудьте проверить, что файл/ресурс существует, и вернуть 404, если нет.
Ответ 4
В дополнение к предыдущим ответам используйте это, чтобы получить изображение на основе среды размещения в System.Web.Hosting
имен System.Web.Hosting
.
var imageUrl = HostingEnvironment.MapPath("~/images/photo.png");
и использовать imageUrl
его, чтобы найти byte[]
изображения, и обработать с правильным типом контента, таким как image/jpeg