.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());

并将其注入到控制器的构造函数中。