asp.net core 2从本地磁盘驱动器加载并显示图像

Sha*_*yar 3 c# asp.net-core asp.net-core-2.0 razor-pages asp.net-core-2.2


有什么方法可以从本地驱动器在 asp.net core 2 (razor) Web 应用程序中显示图像?

我想要这样做的原因是我正在开发一个游戏服务器,其中包含一个游戏服务器和两个网站(前端和管理面板),所有这些都需要访问上述图像,在本例中是个人资料图像这就是为什么我没有将这些图像放在 wwwroot 文件夹中。

示例图片地址:“C:\game_data\avatars\default.png”

Pan*_*vos 9

在大多数情况下,最安全(也是最简单)的选择是将图像存储在网站的根文件夹下,以避免授予网站帐户在网站文​​件夹本身之外的访问权限。

不过,用户个人资料图像并不是静态的。这就是为什么它们通常存储在数据库或其他存储中的原因。

您可以将特定请求路径映射到UseStaticFiles中的自定义位置。从文档示例:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "MyStaticFiles")),
        RequestPath = "/StaticFiles"
    });
}
Run Code Online (Sandbox Code Playgroud)

第一次调用配置wwwroot为静态文件的根。对于以 开头的请求,第二个调用会覆盖此设置/StaticFiles,并指向MyStaticFiles应用程序文件夹下调用的文件夹。

您可以avatar使用以下代码公开路径下的所有个人资料图片:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles(); // For the wwwroot folder

    app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(
            "X:\game_data\avatars\"),
        RequestPath = "/avatars"
    });
}
Run Code Online (Sandbox Code Playgroud)

更好的选择是从配置文件加载位置。

另一个考虑因素是,简单地将文件夹映射到路径将允许任何人读取个人资料图片(如果他们能猜出他们的名字)。这可能是也可能不是一个问题。

如果,您使用的控制器仅返回当前用户的 FileResult,例如:

class AvatarsController
{
    [HttpGet]
    public async Task<IActionResult> Get()
    {
        var userID=SomehowFindTheCurrentUserID();
        var avatarPath= Path.Combine(_avatarRoot,$"{userID}.jpeg");
        return File(avatarPath, "image/jpeg");
    }
} 
Run Code Online (Sandbox Code Playgroud)