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

Posted

技术标签:

【中文标题】asp.net core 2 从本地磁盘驱动器加载和显示图像【英文标题】:asp.net core 2 load and display images from local disk drive 【发布时间】:2019-08-17 16:50:44 【问题描述】:

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

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

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

【问题讨论】:

您不能直接从本地驱动器使用它,但是您可以对其进行编程以从本地驱动器读取此文件,并直接或在保存到项目目录后在您的项目中使用它。 @ZubairRana 所以你的意思是我必须将所需的图像临时复制到 wwwroot 图像并在以后为每个请求删除它?有没有办法将该图像加载到内存中并显示在网页上? 我说你可以在读取文件后使用这两个选项,即“直接或保存在项目目录后”。所以是的,您可以直接使用该文件,而无需保存在 wwwroot 中。 @ZubairRana 但是其他用户怎么能看到该图像,因为该网站将图像地址指向“C:\game_data\avatars\default.png”并且该文件在查看器的系统中不存在. @Shahriyar 对于存储在磁盘上的图像,secure 选项是将它们与其他静态文件一起存储在wwwroot 下的路径中,这样您就不必提供应用程序帐户任何比必要更广泛的权限。不过,您可以使用不同的路径。所有这些都在 ASP.NET Core 启动代码中配置 【参考方案1】:

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

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

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

【讨论】:

感谢您的完整回答 不错的答案!您认为可以在 Blazor Web Assembly 中将图像传递给客户端吗? @AnthonyGriggs 是的。这没什么特别的。您可以在 imgvideoaudio 标记的 src 元素中使用 URL。如果您想使用代码获取字节,您可以使用例如var bytes= await client.GetBytesAsync(thatUrl);。但是,将字节保存到磁盘是另一回事。如果你想显示动态加载的字节,你需要convert them to a data URL first。 javascript 也一样 谢谢,当我在 localhost 中调试时(我使用的是 WASM,但它是 .Net Core Hosted),它确实对我有用。但在部署时,它使应用程序崩溃并出现 500 错误:“HTTP 错误 500.30 - ASP.NET Core 应用程序无法启动”。有什么部署建议吗?【参考方案2】:

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

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

【讨论】:

以上是关于asp.net core 2 从本地磁盘驱动器加载和显示图像的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 2.2 MVC MapRoute 项目到 ASP.NET 3.0 端点 MapAreaControllerRoute “找不到此本地主机页面”

ASP.NET Core:如何获取远程 IP 地址?

本地 Javascript Fetch Post 请求失败,调用 ASP.NET Core 2.2 Web API。 CORS 已启用

ASP.NET Core 2.0 中RequiredAttribute 的本地化

ASP.NET Core 无法在 IIS 下运行:HTTP 错误 500.0 - ANCM 进程内处理程序加载失败

ASP.NET Core 无法在 IIS 下运行:HTTP 错误 500.0 - ANCM 进程内处理程序加载失败