在我的ASP.NET Core项目中,我正在尝试提供这样的html文件:
public IActionResult Index()
{
return File("c:/path/to/index.html", "text/html");
}
这会导致错误:
FileNotFoundException: Could not find file: c:/path/to/index.html
将ErrorMessage的路径粘贴到我的浏览器中,我可以打开文件,因此文件显然就在那里。
我能够提供文件的唯一方法是将它放在项目文件夹中的wwwroot中并按照以下方式提供:
public IActionResult Index()
{
return File("index.html", "text/html");
}
我已经使用app.UseStaticFiles(options)
更改了我提供静态文件的文件夹(有效),所以我认为Controller会将该文件夹用作默认文件夹,但它会继续查找wwwroot。
如何从Controller中提供位于wwwroot之外,甚至在项目之外的文件?
答案 0 :(得分:8)
您需要使用PhysicalFileProvider
类,这是IFileProvider
的实现,用于访问实际系统的文件。来自文档中的File providers部分:
PhysicalFileProvider提供对物理文件系统的访问。它包装System.IO.File类型(对于物理提供程序),确定目录及其子目录的所有路径。此作用域限制访问某个目录及其子目录,从而阻止访问此边界之外的文件系统。实例化此提供程序时,必须为其提供目录路径,该路径充当对此提供程序发出的所有请求的基本路径(并限制此路径之外的访问)。在ASP.NET Core应用程序中,您可以直接实例化PhysicalFileProvider提供程序,也可以通过依赖项注入在Controller或服务的构造函数中请求IFileProvider。
如何创建PhysicalFileProvider
实例并使用它的示例:
IFileProvider provider = new PhysicalFileProvider(applicationRoot);
IDirectoryContents contents = provider.GetDirectoryContents(""); // the applicationRoot contents
IFileInfo fileInfo = provider.GetFileInfo("wwwroot/js/site.js"); // a file under applicationRoot