Как вернуть изображение с помощью метода 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