Using asp.net core web api, I want to have my controller action method to return an jpeg image stream. In my current implementation, browser displays only a json string. My expectation is to see the image in the browser.
While debugging using chrome developer tools I found that the content type is still
Content-Type:application/json; charset=utf-8
returned in the response header, even though in my code I manually set the content type to "image/jpeg".
Looking for a solution My Web API is as below
[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;
}
https://i.stack.imgur.com/bMt50.png
Clean solution use FilestreamResult
!!
[HttpGet]
public IActionResult Get()
{
var image = System.IO.File.OpenRead("C:\\test\\random_image.jpeg");
return File(image, "image/jpeg");
}
Explanation:
In ASP.NET Core you have to use the built-in File()
method inside the Controller. This will allow you to manually set the content type.
Don't create and return HttpResponseMessage
, like you were used to using in ASP.NET Web API 2. It doesn't do anything, not even throwing errors!!
PhysicalFile helps to return file from Asp.Net Core WebAPI with a syntax simple
[HttpGet]
public IActionResult Get(int imageId)
{
return PhysicalFile(@"C:\test.jpg", "image/jpeg");
}
In my case, I was using a relative path to the image, so the following was my working solution
[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;
}
[HttpGet("Image/{id}")]
public IActionResult Image(int id)
{
if(id == null){ return NotFound(); }
else{
byte[] imagen = "@C:\\test\random_image.jpeg";
return File(imagen, "image/jpeg");
}
}
Success story sharing
using
statement?