.Net Core - 通过 api 发送图像 = 资源被解释为文档但使用 MIME 类型传输 image/jpeg
.Net Core - Send image through api = Resource interpreted as Document but transferred with MIME type image/jpeg
在我的 .Net Core MVC 应用程序的 wwwroot 文件夹中,我有一些图像。我需要将这些图片提供给 TopDesk,我可以在其中放入嵌入的 url。我对 Topdesk 没有影响。我只能改变图像的服务方式。
当我对图像使用直接 link 时,它起作用了。图像被嵌入
直接示例url:
https://my.web.site/images/image001.jpeg
但是嵌入的尺寸有限 (600px),所以我需要调整图像的大小。为此,我写了一个非常简单的 api 控制器:
[HttpGet]
[Route("api/Images/GetImage/{id}")]
public IActionResult GetImage(string id)
{
try
{
var pad = $"c:\Images\{id}";
if(System.IO.File.Exists(path))
{
var fileBytes = System.IO.File.ReadAllBytes(path);
var smallImage = ..... doing resizing;
new FileExtensionContentTypeProvider().TryGetContentType(Path.GetFileName(path), out var contentType);
return File(smallImage , contentType ?? "application/octet-stream", $"{id}");
}
return NotFound();
}
catch(Exception ex)
{
return BadRequest(ex.Message);
}
}
但是 url
https://my.web.site/api/images/GetImage/image001.jpeg
结果
Resource interpreted as Document but transferred with MIME type
image/jpeg
图片不显示。
当我在 Postman 中测试 url 时,它 returns 图像没有警告。
我在这里错过了什么?
不要返回 File
,而是尝试使用 FileContentResult
:
[HttpGet]
[Route("api/Images/GetImage/{id}")]
public IActionResult GetImage(string id)
{
try
{
var path = $"c:\Images\{id}";
if(System.IO.File.Exists(path))
{
var fileBytes = System.IO.File.ReadAllBytes(path);
var smallImage = ..... doing resizing;
new FileExtensionContentTypeProvider().TryGetContentType(Path.GetFileName(path), out var contentType);
return new FileContentResult(fileBytes, contentType ?? "application/octet-stream");
}
return NotFound();
}
catch(Exception ex)
{
return BadRequest(ex.Message);
}
}
当使用浏览器导航至 /GetImage/{id}
时,您会看到使用 File
时浏览器倾向于下载文件,但使用 FileContentResult
时它会在浏览器选项卡中显示图像直接,这与使用静态文件的行为相同。这可能是因为在使用 File
/FileContentResult
(可能是 Content-Disposition header)时添加了 Response Headers。不过不确定 TopDesk 如何使用这些图像。
Off-topic:不在每个请求中都实例化 FileExtensionContentTypeProvider
也是一个好习惯。相反,您可以在 Startup.cs 中将其注册为单例,例如:
services.AddSingleton(new FileExtensionContentTypeProvider());
并将其注入到控制器的构造函数中。
在我的 .Net Core MVC 应用程序的 wwwroot 文件夹中,我有一些图像。我需要将这些图片提供给 TopDesk,我可以在其中放入嵌入的 url。我对 Topdesk 没有影响。我只能改变图像的服务方式。
当我对图像使用直接 link 时,它起作用了。图像被嵌入
直接示例url:
https://my.web.site/images/image001.jpeg
但是嵌入的尺寸有限 (600px),所以我需要调整图像的大小。为此,我写了一个非常简单的 api 控制器:
[HttpGet]
[Route("api/Images/GetImage/{id}")]
public IActionResult GetImage(string id)
{
try
{
var pad = $"c:\Images\{id}";
if(System.IO.File.Exists(path))
{
var fileBytes = System.IO.File.ReadAllBytes(path);
var smallImage = ..... doing resizing;
new FileExtensionContentTypeProvider().TryGetContentType(Path.GetFileName(path), out var contentType);
return File(smallImage , contentType ?? "application/octet-stream", $"{id}");
}
return NotFound();
}
catch(Exception ex)
{
return BadRequest(ex.Message);
}
}
但是 url
https://my.web.site/api/images/GetImage/image001.jpeg
结果
Resource interpreted as Document but transferred with MIME type image/jpeg
图片不显示。 当我在 Postman 中测试 url 时,它 returns 图像没有警告。 我在这里错过了什么?
不要返回 File
,而是尝试使用 FileContentResult
:
[HttpGet]
[Route("api/Images/GetImage/{id}")]
public IActionResult GetImage(string id)
{
try
{
var path = $"c:\Images\{id}";
if(System.IO.File.Exists(path))
{
var fileBytes = System.IO.File.ReadAllBytes(path);
var smallImage = ..... doing resizing;
new FileExtensionContentTypeProvider().TryGetContentType(Path.GetFileName(path), out var contentType);
return new FileContentResult(fileBytes, contentType ?? "application/octet-stream");
}
return NotFound();
}
catch(Exception ex)
{
return BadRequest(ex.Message);
}
}
当使用浏览器导航至 /GetImage/{id}
时,您会看到使用 File
时浏览器倾向于下载文件,但使用 FileContentResult
时它会在浏览器选项卡中显示图像直接,这与使用静态文件的行为相同。这可能是因为在使用 File
/FileContentResult
(可能是 Content-Disposition header)时添加了 Response Headers。不过不确定 TopDesk 如何使用这些图像。
Off-topic:不在每个请求中都实例化 FileExtensionContentTypeProvider
也是一个好习惯。相反,您可以在 Startup.cs 中将其注册为单例,例如:
services.AddSingleton(new FileExtensionContentTypeProvider());
并将其注入到控制器的构造函数中。