asp.net 核心 2 从本地磁盘驱动器加载和显示图像

asp.net core 2 load and display images from local disk drive


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

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

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

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

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

您可以将特定请求路径映射到 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"
    });
}

第一次调用将 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"
    });
}

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

另一个考虑因素是,只要将文件夹映射到一个路径,任何人都可以阅读个人资料图片,前提是他们可以猜出他们的名字。这可能是也可能不是问题。

如果它 ,您使用的控制器仅 returns 当前用户作为 FileResult,例如:

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

在启动时添加以下代码 class,而不是图像,设置您的文件夹:

app.UseStaticFiles();
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(
            Path.Combine(Directory.GetCurrentDirectory(), "images")),
                RequestPath = "/images"
            });