我正在尝试返回存储在wwwwroot/images
文件夹中的图像,这是结构:
在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
文件夹。
有什么主意吗?
答案 0 :(得分:1)
您使用的File
方法具有以下签名:
public VirtualFileResult File (string virtualPath, string contentType);
顾名思义,此处的第一个参数代表您要提供服务的文件的 virtual 路径;不是 physical 路径。默认情况下,这意味着您需要提供一个与wwwroot
文件夹 relative 相对应的路径。在您的示例中,路径为images/avatar_default.png
。这样,您的示例中就不需要Path.Combine
或IHostingEnvironment
。这是更新的版本:
[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");
}