什么是静态文件
在 Web 开发中,像js,css,img等都称为静态文件,Asp .Net Core 提供了三个中间件来处理静态文件,我们不仅可以通过http请求将这些物理文件发布成可以Web资源,还可以将所在目录的物理结构也给呈现出来。
在项目目录中有一个【wwwroot】的文件夹,这个是web根目录,在根目录下所有的文件会自动发布成资源,客户端可以通过url读取对应的文件。
【UseStaticFiles】是其中一个处理静态文件的中间件。在项目启动时调用 【UseStaticFiles】就能启动这个功能。
public static void Run(){ Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure( app=>app.UseStaticFiles())) .Build() .Run();}
看一下结果:
【UseStaticFiles】会将web根目录下所有文件发布成资源,那要是文件存在别的目录下该怎么做呢?
在asp .net core 中呢都是利用一个文件提供对象来处理静态文件的 ,虽在在这里使用【UseStaticFiles】来处理静态文件,但是在他的内部同样维护着一个文件提供对象和请求路径的映射关系。再调用这个方法的时候,如果没有指定任何参数,这个映射关系的请求路径就是项目的根地址,对应的文件提供对象自然指向web根目录【wwwroot】。
所以我们实现这一功能就要显示的指定映射关系。例如我们要获取【content】下面的文件
public static void Run(){ var path = Path.Combine(Directory.GetCurrentDirectory(), "content"); // 静态文件中间件配置 var options = new StaticFileOptions { FileProvider = new PhysicalFileProvider(path), RequestPath = "/content" }; Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure( app=>app // 静态文件中间件 .UseStaticFiles() .UseStaticFiles(options))) .Build() .Run();}
第一步,获取项目路径
第二步,创建配置对象
第三步,将配置传入中间件
运行没有问题,我们再看一下【wwwroot】下的有没有问题。
根目录也没有问题,因为我们添加两个【UseStaticFiles】,目前这个只能满足找到具体的文件,如果访问目录的就会报404的错误,如何像开始那样可以访问到目录呢?这就要用到一个目录浏览的中间件。
添加【UseDirectoryBrowser】中间件就可以返回一个html页面将文件目录以列表的方式呈现出来,不加参数时,则对应的是web根目录。
public static void Run(){ var path = Path.Combine(Directory.GetCurrentDirectory(), "content"); var fileProvider = new PhysicalFileProvider(path); var staticFileOptions = new StaticFileOptions { FileProvider = fileProvider, RequestPath = "/content" }; // 目录浏览中间件配置 var directoryBrowserOptions = new DirectoryBrowserOptions { FileProvider = fileProvider, RequestPath = "/content" }; Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure( app=>app // 目录浏览中间件 .UseStaticFiles() .UseStaticFiles(staticFileOptions) .UseDirectoryBrowser() .UseDirectoryBrowser(directoryBrowserOptions))) .Build() .Run();}
这样就可以将文件目录给呈现出来了,但这样就会存在安全的问题,那可不可以在访问目录的时候只给它默认的文件看呢?这是就用到默认页面中间件【UseDefaultFiles】,用法和上面两个一样。
// 默认页面中间件配置var defaultFilesOptions = new DefaultFilesOptions{ FileProvider = fileProvider, RequestPath = "/content"}
ps:【UseDefaultFiles】必须在【UseStaticFiles】之前调用
Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(builder => builder.Configure( app => app // 默认页面中间件 .UseDefaultFiles() .UseDefaultFiles(defaultFilesOptions) .UseStaticFiles() .UseStaticFiles(staticFileOptions) .UseDirectoryBrowser() .UseDirectoryBrowser(directoryBrowserOptions))) .Build() .Run();
如果目录下的默认文件没有按照约定命名,我们可以同手动添加的方式添加进来。
defaultFilesOptions.DefaultFileNames.Add("readme.html");
感谢您的关注,您分享和点赞,是我分享路上最大的动力
留言区