如何从wwwroot返回图像?

时间:2018-10-19 14:13:05

标签: c# asp.net asp.net-core

我正在尝试返回存储在wwwwroot/images文件夹中的图像,这是结构:

enter image description here

View内,我有以下标签:

<img src="@Url.Action("GetAvatar", "User", new { username = User.Identity.Name })" />

如您所见,为显示图像,只需从GetAvatar控制器调用User方法,并将用户名作为参数即可。

该方法具有以下配置:

[HttpGet]
public FileResult GetAvatar(string username)
{
   User user = _repo.GetUser(username);

   if(user.UserDetail != null)
      return File(user.UserDetail?.UserPhoto, "image/png");

   //The user has no custom image, will displayed the default.
   string root = Path.Combine(_env.WebRootPath, "images");

   return File(Path.Combine(root, "avatar_default.png"), "image/png");
}

从数据库中检索图像的方法的第一部分有效,但是最后一个试图从wwwroot文件夹中获得图像的部分无效。实际上,当我加载View时,我得到了损坏的缩略图,表示未找到。

我还注入了IHostingEnvironment用于访问wwwroot文件夹。

有什么主意吗?

1 个答案:

答案 0 :(得分:1)

您使用的File方法具有以下签名:

public VirtualFileResult File (string virtualPath, string contentType);

顾名思义,此处的第一个参数代表您要提供服务的文件的 virtual 路径;不是 physical 路径。默认情况下,这意味着您需要提供一个与wwwroot文件夹 relative 相对应的路径。在您的示例中,路径为images/avatar_default.png。这样,您的示例中就不需要Path.CombineIHostingEnvironment。这是更新的版本:

[HttpGet]
public FileResult GetAvatar(string username)
{
   User user = _repo.GetUser(username);

   if(user.UserDetail != null)
      return File(user.UserDetail?.UserPhoto, "image/png");

   return File("images/avatar_default.png", "image/png");
}