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 是的。这没什么特别的。您可以在img
、video
或 audio
标记的 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 “找不到此本地主机页面”
本地 Javascript Fetch Post 请求失败,调用 ASP.NET Core 2.2 Web API。 CORS 已启用
ASP.NET Core 2.0 中RequiredAttribute 的本地化