Возврат изображения jpeg из Asp.Net Core WebAPI

Используя asp.net core web api, я хочу, чтобы мой метод действия контроллера возвращал поток изображений jpeg.
В моей текущей реализации браузер отображает только строку json. Я ожидаю увидеть изображение в браузере.

При отладке с помощью инструментов разработчика Chrome я обнаружил, что тип контента все еще

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

возвращается в заголовке ответа, хотя в моем коде я вручную установил тип содержимого «image / jpeg».

Ищу решение. Мой веб-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;
}

введите описание изображения здесь


person hannes neukermans    schedule 24.11.2016    source источник


Ответы (3)


Чистое решение используйте FilestreamResult !!

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

Объяснение:

В ASP.NET Core вы должны использовать встроенный File() метод внутри контроллера. Это позволит вам вручную установить тип контента.

Не создавайте и не возвращайте HttpResponseMessage, как вы привыкли использовать в ASP.NET Web API 2. Он ничего не делает, даже не выдает ошибок !!

person hannes neukermans    schedule 24.11.2016
comment
Visual Studio сообщает, что этот метод не использует await и поэтому будет работать синхронно. Можно ли кэшировать файл, чтобы его не приходилось каждый раз читать? Почему бы не использовать метод перегруженного файла, который принимает путь к файлу вместо чтения файла? А при чтении файла почему бы не использовать оператор using? - person developer82; 26.03.2018
comment
напишите строку как: return await Task.Run (() = ›File (image, image / jpeg)); удалил ошибку для меня и тоже работал. - person jman; 13.04.2018
comment
Переписывание метода с «async Task ‹IActionResult›» на «IActionResult» тоже делает трюк более чистым (Visual Studio правильно заявляет, что в этом методе асинхронное поведение);) ... - person DotBert; 17.10.2018
comment
не забудьте удалить этот объект OpenRead, но PhysicalFile - лучшее решение. - person gbjbaanb; 21.09.2019
comment
Здесь вам не нужны async и Task<> в сигнатуре вашего метода. - person A-Sharabiani; 09.10.2019
comment
изменен код, поэтому предупреждение async больше не отображается в vs @DotBert - person hannes neukermans; 04.03.2021

PhysicalFile помогает вернуть файл из Asp.Net Core WebAPI с простым синтаксисом

    [HttpGet]
    public IActionResult Get(int imageId)
    {            
       return PhysicalFile(@"C:\test.jpg", "image/jpeg");
    }
person Antoine V    schedule 25.07.2018
comment
Интересно, это асинхронно? Я не хочу связываться с тупиковой блокировкой или недоступным файлом? - person ASLIM; 24.01.2020
comment
@ASLIM Метод PhysicalFile () возвращает экземпляр типа PhysicalFileResult, который в свою очередь поддерживает асинхронное выполнение. Итак, если я правильно понимаю, инфраструктура ASP.NET выберет этот асинхронный метод, который, в свою очередь, вызовет PhysicalFileResultExecutor.ExecuteAsync () - ›response.SendFileAsync (). Поэтому я предполагаю, что асинхронная часть прозрачна. - person XDS; 15.03.2021

В моем случае я использовал относительный путь к изображению, поэтому моим рабочим решением было следующее:

[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;
}
person Mustafamg    schedule 16.12.2019