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

时间:2019-03-27 07:24:10

标签: c# asp.net-core asp.net-core-2.0 razor-pages asp.net-core-2.2


有什么方法可以显示来自本地驱动器的asp.net core 2(剃刀)Web应用程序中的图像?

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

答案 1 :(得分:0)

实际上,您可以在IIS服务器中的Web服务器上托管一个文件夹“图像”(例如 )。您可以通过网址在任何地方访问图像,

http[s]://<ServerDomainName>/images/<YourFileName.Ext>

实际上,w3c不建议引用本地路径。这就是为什么Google Chrome和其他现代浏览器无法记住使用来上传文件的实际位置,

<input type="file" />

它可以解决您的问题吗?

答案 2 :(得分:0)

在启动类中添加以下代码,而不是图像,设置文件夹:

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