将静态文件放在 wwwroot 以外的文件夹中

页面创建日期 :

环境

Visual Studio
  • Visual Studio 2019
ASP.NET Core
  • 3.1 (Razor 页面, MVC)

关于静态文件的默认放置位置

默认情况下,静态文件(.js、.css、.png等)将保留在 wwwroot 文件夹下。 这允许网站用户直接查看 .js 和 .css 文件以及 HTML 并在屏幕上传播。

此静态文件的默认部署文件夹是 Startup.Configure wwwroot,它调用方法 app.UseStaticFiles 中描述的以下方法:

public class Startup
{
  // 省略

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  {
    // 省略

    app.UseStaticFiles();

    // 省略
  }
}

物理文件夹"wwwroot"的路径在URL中为"https://<主机名>/"的部位, 例如,"wwwroot\image\sample.png"中的文件在 URL 中可以通过 https://<主机名>/image/sample.png引用。

放置在 wwwroot 文件夹之外的文件基本上不能从 Web 上的 URL 引用。

如何将静态文件放在 wwwroot 文件夹之外,并更改 URL 中的引用路径

文件夹配置

这一次,我想将图像文件放在单独的文件夹中,以便在 Web 上引用它,同时保留 wwwroot 文件夹的功能。

项目的文件夹配置如下所示,以引用 Areas 中每个站点的内容文件夹中的图像文件。

在此状态下,引用 sample1.png 文件中的文件的 URL 是

  • https://<主机名>/areas/site1/content/image/sample1.png

  • https://<主机名>/site1/content/image/sample1.png

可能看起来,但在这里

  • https://<主机名>/site1/image/sample1.png

在 中提供引用。

顺便说一下,如果您将静态文件放在 wwwroot 文件夹之外,则该文件 的生成操作 可能为"无"。 如果继续,则发布不会放置文件,因此请确保 将文件 重新设置为内容。

添加程序

若要允许在 wwwroot 以外的文件夹中引用静态文件, Startup.Configure 请在 app.UseStaticFiles 方法中调用其他方法,如下所示:

// 追加
using Microsoft.Extensions.FileProviders;
using System.IO;

// 省略

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
  // 省略

  // wwwroot フォルダで静的ファイル参照を有効にする
  app.UseStaticFiles();

  // Site1 用の物理コンテンツフォルダと参照 URL を紐づける
  app.UseStaticFiles(new StaticFileOptions()
  {
    FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Areas/Site1/Content")),
    RequestPath = "/Site1",
  });

  // Site2 用の物理コンテンツフォルダと参照 URL を紐づける
  app.UseStaticFiles(new StaticFileOptions()
  {
    FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "Areas/Site2/Content")),
    RequestPath = "/Site2",
  });

  // 省略
}

app.UseStaticFiles 在没有参数的情况下调用方法将启用 wwwroot 文件夹。 将 传递给第 StaticFileOptions 一个参数时,可以进行其他设置。

StaticFileOptions.FileProviderPhysicalFileProvider 属性的实例传递给 ,并指定要作为静态文件引用的物理文件夹。 此处指定的路径下的文件是 Web 可以引用的文件。 它还是 RequestPath 以下属性的 URL 的根:

env.ContentRootPath 属性包含 Web 程序的根路径(物理路径)。 您可以合并此路径和目标文件夹的相对路径。

StaticFileOptions.RequestPath 属性描述引用静态文件的 URL 的根路径。 默认 wwwroot https://<ホスト名> 以 如上面的 RequestPath = "/Site1" 代码所示, https://<ホスト名>/Site1 是根。 这 Areas/Site1/Content/xxxx 会将 URL https://<ホスト名>/Site1/xxxx 与 的物理路径关联。

以 sample1.png为例 Areas/Site1/Content/image/sample.png ,文件 https://<ホスト名>/Site1/image/sample.png 可以引用为 的路径。

操作确认

index.html 将 img 标记放在 中,以便可以按如下方式引用图像: 路径还引用 site1 和 site2 的图像,以定义它们。

<!-- 省略 -->

<div class="text-center">
	<h1 class="display-4">Welcome</h1>
	<p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
</div>

<!-- ここから追加 -->
<img src="~/image/sample.png" />
<img src="~/site1/image/sample1.png" />
<img src="~/site2/image/sample2.png" />
<!-- ここまで追加 -->

如果你运行它,并看到图像,这是成功的。