ASP.NET Core静态文件的使用方法

简介: 静态文件(HTML,CSS,图片和Javascript之类的资源)会被ASP.NET Core应用直接提供给客户端。静态文件通常位于网站根目录(web root) <content-root>/wwwroot文件夹下。通常会把项目的当前目录设置为Content root,这样项目的web root就可以在开发阶段被明确。

前言

静态文件(HTMLCSS,图片和Javascript之类的资源)会被ASP.NET Core应用直接提供给客户端。

静态文件通常位于网站根目录(web root) <content-root>/wwwroot文件夹下。通常会把项目的当前目录设置为Content root,这样项目的web root就可以在开发阶段被明确。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

 WebHost.CreateDefaultBuilder(args)

 .UseContentRoot(Directory.GetCurrentDirectory()) //设置当前目录

 .UseStartup<Startup>();

静态文件能够被保存在网站根目录下的任意文件夹内,并通过相对根的路径来访问。使用vs创建一个默认的Web应用程序时,在wwwroot目录下会生成几个文件夹:css,images,js。如果压迫访问images目录下的图片:

  http://<app>/iamges/filename

  https://localhost:44303/iamges/filename

要想使用静态文件服务,必须配置中间件,把静态文件中间件加入到管道。静态文件一般会默认配置,在Configure方法中调用app.UseStaticFiles()

app.UseStaticFiles() 使得web root(默认为wwwroot)下的文件可以被访问。同时可以通过UseStaticFiles方法将其他目录下的内容也可以向外提供:

假如wwwroot外面有一个MyStaticFiles文件夹,要访问文件夹里面的资源test.png:  

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{


 app.UseHttpsRedirection();

 app.UseStaticFiles();

 app.UseStaticFiles(new StaticFileOptions() {

 FileProvider = new PhysicalFileProvider(

  Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")), //用于定位资源的文件系统

 RequestPath = new PathString("/StaticFiles") //请求地址

 });


}

可以通过访问

  http://<app>/StaticFiles/test.png

  https://localhost:44303/StaticFiles/test.png

1.静态文件授权

静态文件组件默认不提供授权检查。任何通过静态文件中间件访问的文件都是公开的。要想给文件授权,可以将文件保存在wwwroot之外,并将目录设置为可被静态文件中间件能够访问,同时通过一个controller action来访问文件,在action中授权后返回FileResult。

2.目录浏览

目录浏览允许网站用户看到指定目录下的目录和文件列表。基于安全考虑,默认情况下是禁止目录访问功能。在Startup.Configure中调用UseDirectoryBrowser扩展方法可以开启网络应用目录浏览:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{

 app.UseStaticFiles();


 app.UseDirectoryBrowser(new DirectoryBrowserOptions() {

 FileProvider = new PhysicalFileProvider(

  Path.Combine(Directory.GetCurrentDirectory(),@"wwwrootimages")),

 RequestPath = new PathString("/MyImages") //如果不指定RequestPath,会将PhysicalFileProvider中的路径参数作为默认文件夹,替换掉wwwroot

}); }

然后在Startup.CongigureServices中调用AddDirectoryBrowser扩展方法。

这样就可以通过访问http://<app>/MyImages浏览wwwroot/images文件夹中的目录,但是不能访问文件:

网络异常,图片无法展示
|
  

要想访问具体文件需要调用UseStaticFiles配置: 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{

 app.UseStaticFiles();

 app.UseStaticFiles(new StaticFileOptions() {

 FileProvider = new PhysicalFileProvider(

  Path.Combine(Directory.GetCurrentDirectory(), @"wwwrootimages")), //用于定位资源的文件系统

 RequestPath = new PathString("/MyImages")

 });

 app.UseDirectoryBrowser(new DirectoryBrowserOptions() {

 FileProvider = new PhysicalFileProvider(

  Path.Combine(Directory.GetCurrentDirectory(),@"wwwrootimages")),

 RequestPath = new PathString("/MyImages")

 });


}

3.默认文件

设置默认首页能给站点的访问者提供一个起始页,在Startup.Configure中调用UseDefaFiles扩展方法:

 app.UseDefaultFiles(options);

 app.UseStaticFiles();

UseDefaultFiles必须在UseStaticFiles之前调用。UseDefaultFiles只是重写了URL,而不是真的提供了一个这样的文件,浏览器URL将继续显示用户输入的URL。所以必须开启静态文件中间件。而且默认文件必须放在静态文件中间件可以访问得到的地方,默认是wwwroot中。

通过UseDefaultFiles,请求文件夹的时候检索以下文件:

  default.htm

  default.html

  index.htm

  index.html

也可以使用UseDefaultFiles将默认页面改为其他页面:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{

 if (env.IsDevelopment())

 {

 app.UseDeveloperExceptionPage();

 }

 else

 {

 app.UseExceptionHandler("/Home/Error");

 app.UseHsts();

 }


 app.UseHttpsRedirection();

 DefaultFilesOptions options = new DefaultFilesOptions();

 options.DefaultFileNames.Clear();

 options.DefaultFileNames.Add("mydefault.html");

 app.UseDefaultFiles(options);

 app.UseStaticFiles();



 app.UseMvc(routes =>

 {

 routes.MapRoute(

  name: "default",

  template: "{controller=Home}/{action=Index}/{id?}");

 });

}

4.UseFileServer

UseFileServer集合了UseStaticFiles,UseDefaultFiles,UseDirectoryBrowser。

调用app.UseFileServer(); 请用了静态文件和默认文件,但不允许直接访问目录。需要调用app.UseFileServer(enableDirectoryBrowsing:true); 才能启用目录浏览功能。

如果想要访问wwwroot以外的文件,需要配置一个FileServerOptions对象 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{       app.UseStaticFiles();//如果不调用,将不会启动默认功能。

 app.UseFileServer(new FileServerOptions()

 {

 FileProvider = new PhysicalFileProvider(

  Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")),

 RequestPath = new PathString("/StaticFiles"),

 EnableDirectoryBrowsing = true

 });

}

注意,如果将enableDirectoryBrowsing设置为true,需要在ConfigureServices中调用services.AddDirectoryBrowser();

如果默认文件夹下有默认页面,将显示默认页面,而不是目录列表。

5.FileExtensionContentTypeProvider

FileExtensionContentTypeProvider类包含一个将文件扩展名映射到MIME内容类型的集合。

例如:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

{

 var provider = new FileExtensionContentTypeProvider();

 provider.Mappings[".htm3"] = "text/html";

 provider.Mappings["images"] = "iamge/png";

 provider.Mappings.Remove(".mp4");


 app.UseStaticFiles(new StaticFileOptions() {

 FileProvider = new PhysicalFileProvider(

  Path.Combine(Directory.GetCurrentDirectory(), @"MyStaticFiles")),

 RequestPath = new PathString("/StaticFiles"),

 ContentTypeProvider = provider

 });

}

更多MIME类型可以访问:http://www.iana.org/assignments/media-types/media-types.xhtml

6.非标准的内容类型

如果用户请求了一个未知的文件类型,静态文件中间件将会返回HTTP 404响应。如果启用目录浏览,则该文件的链接将会被显示,但RUI会返回一个HTTP404错误。

使用UseStaticFiles方法可以将未知类型作为指定类型处理:

app.UseStaticFiles(new StaticFileOptions() {

 ServeUnknownFileTypes = true,

 DefaultContentType = "application/x-msdownload"

 });

对于未识别的,默认为application/x-msdownload,浏览器将会下载这些文件。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,米米素材网谢谢大家的支持。

相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
1月前
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
27 1
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
87 3
|
22天前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
37 7
|
2月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
52 0
|
3月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
45 0
|
3月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
3月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
118 0