ASP.NET6 Blazor网站:目录是否可以Map为wwwroot下的虚拟子目录?

a64a0gku  于 2022-11-19  发布在  .NET
关注(0)|答案(2)|浏览(263)

我可以将任意目录Map为wwwroot的子目录吗?也就是说,该目录在文件系统中不在wwwroot下,但在我的应用程序中,它会被视为wwwroot的子目录。
例如,我创建了一个ASP.NET6.0BlzorServer项目,程序dll路径位于/app/proj1/BlazorApp1.dll,如果在/app/proj1/wwwroot/images/dog.jpg有一个映像,它可以在我的页面中使用<img src="images/dog.jpg"/>来呈现。但是如果我不想让这个images目录实际位于文件系统上的wwwroot目录下,该怎么办?是否可以将目录设置为/data/images之类的其他位置,然后将该路径Map到wwwroot/images,以便在应用中使用<img src="images/dog.jpg"/>呈现/data/images/dog.jpg

qzlgjiam

qzlgjiam1#

有3种方法可以做到这一点,我知道,首先调整设置,这是明确记录在msdn,在'服务文件以外的网站根'标题;

app.UseStaticFiles(new StaticFileOptions
{
    FileProvider = new PhysicalFileProvider(
           Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles")),
    RequestPath = "/StaticFiles"
});

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-6.0#serve-files-outside-of-web-root
对于您的情况,由于您需要wwwroot和另一个文件,请参阅“从多个位置提供文件”;

var webRootProvider = new PhysicalFileProvider(builder.Environment.WebRootPath);
var newPathProvider = new PhysicalFileProvider(
  Path.Combine(builder.Environment.ContentRootPath, "MyStaticFiles"));

var compositeProvider = new CompositeFileProvider(webRootProvider,
                                                  newPathProvider);

// Update the default provider.
app.Environment.WebRootFileProvider = compositeProvider;

app.UseStaticFiles();

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/static-files?view=aspnetcore-6.0#serve-files-from-multiple-locations
另一种方法是使用MSBuild将文件从另一个目录复制到wwwroot文件夹中,例如参见下面的SO;
Copy files to output directory using csproj dotnetcore
最后,这是不是可移植的,你可以使用符号链接,见:
符号链接是指向另一个文件系统对象的文件系统对象。被指向的对象称为目标。
符号链接对用户是透明的;链接看起来像普通的文件或目录,并且可以由用户或应用程序以完全相同的方式对其进行操作。
https://learn.microsoft.com/en-us/windows/win32/fileio/symbolic-links
https://en.wikipedia.org/wiki/Symbolic_link
https://superuser.com/questions/1020821/how-can-i-create-a-symbolic-link-on-windows-10
第一个应该能满足你的需求。

5lhxktic

5lhxktic2#

您可以尝试如下所示,使用复合文件提供程序更新默认提供程序:

var webRootProvider = new PhysicalFileProvider(builder.Environment.WebRootPath);
var newPathProvider = new PhysicalFileProvider(
  Path.Combine(builder.Environment.ContentRootPath, "data"));

var compositeProvider = new CompositeFileProvider(webRootProvider,
                                                  newPathProvider);

app.Environment.WebRootFileProvider = compositeProvider;

app.UseStaticFiles();

结果:

相关问题