将文件上传并保存到根文件夹外的 IIS 虚拟目录

Posted

技术标签:

【中文标题】将文件上传并保存到根文件夹外的 IIS 虚拟目录【英文标题】:Uploading and saving a file to IIS virtual directory outside the root folder 【发布时间】:2021-11-03 04:08:33 【问题描述】:

基于微软的网站以及这个论坛,普遍的共识似乎是将网站上传的用户文件保存在 wwwroot 文件夹 (C:\inetpub\wwwroot) 之外,甚至更好地保存在系统驱动器之外。我在 IIS 中为我​​的文件上传设置了一个虚拟目录(C:\inetpub\files),该目录位于 wwwroot 之外,但仍在 C 驱动器上(我们只有一个驱动器,我无法对其进行分区以创建另一个驱动器)。所以希望这在这方面仍然被认为是安全的!然而,我的问题是我使用以下代码将目录获取到我的托管环境:

                    var filePath = Path.Combine(env.WebRootPath, document.DOCUMENT_LOCATION);
                    var fileName = document.FILENAME_AFTER_UPLOAD;
                    var fullPath = Path.Combine(filePath, fileName);

我不确定我应该使用什么文件路径来保存到虚拟目录。虚拟目录的别名是“files”,所以它的虚拟路径是/files,所以我应该使用 env.WebRootPath +“/files”还是有其他方法可以访问虚拟目录/路径?后台文档是来自 SQL 查询的模型对象,它返回我要保存到的文件路径和我们在 SQL 服务器中创建的文件名。

【问题讨论】:

你的意思是把文件上传到指定的路径,比如C盘还是D盘? 我想使用 ihostenviroment 命名空间中的 env.webrootpath 来保持我的代码更加动态。但是,我将文件上传文件夹存储在 env.webrootpath 的父目录之外,因为它位于 wwwroot 之外 【参考方案1】:

所以,你想在 env.webrootpath 的父目录中上传一个文件之外的文件意味着 wwwroot 文件夹。所以试试下面的代码:-

var filePath = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/img", document.Document.FileName);

以上,env.webrootpath 无需使用,因为您希望路径更加动态。

或者如果你想上传到 C 盘而不是 wwwroot。

string SavePath = Path.Combine(Directory.GetCurrentDirectory(), (@"C:\", model.FormFile.FileName);

【讨论】:

asp.net 核心项目带有一个 wwwroot 文件夹,其中包含 js、css 和 img 文件夹等。当您在 IIS 中启动一个新站点时,wwwroot 文件夹是公共文件夹。所以奇怪的是我在 wwwroot 文件夹中有一个 wwwroot 文件夹。我是否应该调整我的 IIS 站点,使公用文件夹是子 wwwroot? @Bradyboyy88 如果你有两个 wwwroot 文件夹,你可以删除一个。或者你可以调整它。主要是你的路径是否正确。 很奇怪,Visual Studio 中的所有 asp.net 核心应用程序模板都包含 wwwroot 文件夹,而 wwwroot 文件夹不应该包含所有附加文件,例如 startup.cs 等?我决定改变我的 IIS 站点的路径,使其带有 css、js 和 img 库的子 wwwroot 并且该站点不会加载,这使我认为 VS 模板中包含的 wwwroot 文件夹不应称为 wwwroot。

以上是关于将文件上传并保存到根文件夹外的 IIS 虚拟目录的主要内容,如果未能解决你的问题,请参考以下文章

将 default.aspx 重定向到根虚拟目录

怎么访问不在网站目录下文件(iis虚拟目录设置)

Tomcat配置虚拟路径访问容器外的硬盘资源

IIS 301 从子文件夹重定向到根文件夹

怎样设置iis虚拟目录,然后将主目录指向别人的共享文件夹

文件上传之中间件