如何在没有控制器的 Blazor 应用程序剃刀页面中找到 wwwroot 的物理路径?

Lyn*_*ark 6 blazor-server-side

我正在尝试在我的 blazor 应用程序( blazor 服务器应用程序)的页面中使用以下代码

@inject IWebHostEnvironment WebhostEnvironment

public IWebHostEnvironment _environment { get; set; }


   var uploads = Path.Combine(_environment.WebRootPath, "uploads");
    //string uploads = @"z:\Downloads";


                path = uploads + "\\"  + file.FileInfo.Name;
                FileStream filestream = new FileStream(path, FileMode.Create, FileAccess.Write);
                file.Stream.WriteTo(filestream);
                filestream.Close();
                file.Stream.Close();
Run Code Online (Sandbox Code Playgroud)

将文件保存在 wwwroot 文件夹内的上传文件夹中,但是当我执行代码时,我得到“对象引用未设置为对象的实例”。

问题 1. 是什么原因导致该错误?2.将上传内容保存在 wwwroot 子文件夹中是最佳途径吗?3. 在网络服务器环境中,是否可以简单地将网络路径设置在字符串变量中作为替代方案?当我取消注释上面的字符串上传行时,上传成功到我的家庭网络上的指定网络驱动器。

感谢您提供任何信息...

小智 5

当前的解决方案对我来说不起作用,因为我正在使用 Blazor wasm。可以通过访问AppDomain或AppContext找到物理路径:

string rootpath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot");
Run Code Online (Sandbox Code Playgroud)

要访问两者,您可以使用:

var b = $"Physical location {AppDomain.CurrentDomain.BaseDirectory}";
var c = $"AppContext.BaseDir {AppContext.BaseDirectory}";
Run Code Online (Sandbox Code Playgroud)


小智 4

我假设我们谈论的是“Blazor 服务器端”。

物理 wwwroot 文件夹可以通过以下方式找到:

string rootpath = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), "wwwroot");
Run Code Online (Sandbox Code Playgroud)

将上传的文件保存到 wwwroot 的子目录有时并不是最佳选择,因为出于安全原因,该位置必须是只读的。您的用户需要下载回上传的文件吗?如果没有,wwwroot 之外的临时文件夹将是更好的位置。

网络路径?这是可能的,但您的 Web 应用程序应该在具有此位置的读写权限的凭据下运行。通常,Web 应用程序使用受限制的凭据运行。

结论:您的最后两个问题必须考虑到安全问题。