返回文件路径的操作方法有时不起作用.为什么

本文关键字:不起作用 为什么 操作方法 文件 路径 返回 | 更新日期: 2023-09-27 17:57:03

>我有这个:

[AllowAnonymous]
public FilePathResult GetImage(string user)
{
    var path = AppDomain.CurrentDomain.BaseDirectory + "files''uploads''users''" + user + "''avatar''";
    var ext = this.GetImageExtension(path, user);
    return ext != null ? File(path + user + "." + ext, "image/" + ext, user + "." + ext) : File(AppDomain.CurrentDomain.BaseDirectory + "files''commonFiles''users''avatar''noavatar.png", "image/png", "noavatar.png");
}

在我的观点中,我有这个:

<img src="/MyAccount/GetImage/?user=@User.Identity.Name" 
     alt="@User.Identity.Name" />

现在,每当我在 Web 开发人员服务器中使用它时,它都可以正常工作。但是当我在我的服务器上发布我的网站时,它甚至没有尝试点击该操作。为什么?

返回文件路径的操作方法有时不起作用.为什么

为什么?

由于您已将 url 硬编码到控制器操作,而不是使用 url 帮助程序:

<img src="@Url.Action("GetImage", "MyAccount", new { user = User.Identity.Name })" alt="@User.Identity.Name" />

切勿在 ASP.NET MVC 应用程序中对 url 进行硬编码,而应始终使用 url 帮助程序。

此外,将当前登录的用户作为查询字符串参数传递看起来是一个可怕的安全问题。没有什么可以阻止用户传递他喜欢的任何用户名并查阅该用户的图像。您应该在控制器操作中读取当前经过身份验证的用户。

因此,首先摆脱此查询字符串参数:

<img src="@Url.Action("GetImage", "MyAccount")" alt="@User.Identity.Name" />

然后在控制器操作中,您始终可以使用 User.Identity.Name 属性检索当前登录的用户:

[Authorize]
public FilePathResult GetImage()
{
    string user = User.Identity.Name;
    var path = Server.MapPath(
        string.Format("~/files/uploads/users/{0}/avatar/", user)
    );
    var ext = this.GetImageExtension(path, user);
    if (string.IsNullOrEmpty(ext))
    {
        return File(
            Server.MapPath("~/files/commonFiles/users/avatar/noavatar.png"), 
            "image/png", 
            "noavatar.png"
        );
    }
    var file = Path.ChangeExtension(Path.Combine(path, user), ext);
    return File(file, "image/" + ext, user + "." + ext);
}

我还使用 [Authorize] 属性修饰了此控制器操作,使其仅供经过身份验证的用户访问。如果不是这种情况,您仍然可以保留 [AllowAnonymous] 属性,但在尝试访问他的用户名之前检查User.Identity.IsAuthenticated