1、提供静态文件:
.NETCORE中,静态文件不可以被直接访问,而是需要放到wwwroot文件夹下
默认 Web 应用模板在 Startup.Configure 中调用 UseStaticFiles 方法,这就允许提供静态文件
默认wwwroot文件夹为Web根目录,这点概念和.Net 4.x里面的MVC不一样
app.UseStaticFiles();
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();//映射到wwwroot文件夹
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
});
}无参数 UseStaticFiles 方法重载将 Web根目录中的文件标记为可访问
例:访问这个文件的话/wwwroot/images/MyImage.jpg
<img src="~/images/MyImage.jpg" class="img" alt="My image" />
在上面的代码中,~/就代表的wwwroot(web根目录)
2、提供web根目录之外的文件
假设我的静态文件放在其他文件夹里,文件夹不叫wwwroot,该怎么办呢?
┌──wwwroot
│ ├─css
│ ├─images
│ └─js
├──MyStaticFiles
│ ├─images
│ │ ├─red-rose.jpg
比如以上这个目录结构,我要访问red-rose.jpg文件
app.UseStaticFiles(); //这句需要改下
// using Microsoft.Extensions.FileProviders;
// using System.IO;
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "MyStaticFiles")),
RequestPath = "/StaticFiles" //指定一个路径前缀名称 不必须
});在前面的代码中,MyStaticFiles 目录层次结构通过 StaticFiles URI 段公开 。
例:访问/MyStaticFiles/images/red-rose.jpg
<img src="~/StaticFiles/images/red-rose.jpg" class="img" alt="A red rose" />
这时候~/不再代表wwwroot,代表的是MyStaticFiles文件夹
3、利用外部文件访问的逻辑,来提供文件授权
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
// wwwroot css, JavaScript, and images don't require authentication.
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.ContentRootPath, "MyStaticFiles")),
RequestPath = "/StaticFiles"
});
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}以上代码中,UseStaticFiles方法出现了两次,第一次在授权之前,第二次在授权之后,并指定了新的目录,新的目录将在授权后才能访问
还有一种方式就是将文件访问封装到需要授权的方法中
[Authorize]
public IActionResult BannerImage()
{
var filePath = Path.Combine(_env.ContentRootPath, "MyStaticFiles", "images", "red-rose.jpg");
return PhysicalFile(filePath, "image/jpeg");
}4、FileExtensionContentTypeProvider类使用,包含 Mappings 属性,用作文件扩展名到 MIME 内容类型的映射
在以下示例中,多个文件扩展名映射到了已知的 MIME 类型。 替换了 .rtf 扩展名,删除了 .mp4
// using Microsoft.AspNetCore.StaticFiles;
// using Microsoft.Extensions.FileProviders;
// using System.IO;
// Set up custom content types - associating file extension to MIME type
var provider = new FileExtensionContentTypeProvider();
// Add new mappings
provider.Mappings[".myapp"] = "application/x-msdownload";
provider.Mappings[".htm3"] = "text/html";
provider.Mappings[".image"] = "image/png";
// Replace an existing mapping
provider.Mappings[".rtf"] = "application/x-msdownload";
// Remove MP4 videos.
provider.Mappings.Remove(".mp4");
app.UseStaticFiles(new StaticFileOptions
{
FileProvider = new PhysicalFileProvider(Path.Combine(env.WebRootPath, "images")),
RequestPath = "/MyImages",
ContentTypeProvider = provider
});项目中,遇到下载apk文件的时候,不允许,就需要配置一下
app.UseStaticFiles(new StaticFileOptions
{
//FileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory()),
//设置不限制content-type 该设置可以下载所有类型的文件,但是不建议这么设置,因为不安全
//下面设置可以下载apk类型的文件
ContentTypeProvider = new FileExtensionContentTypeProvider(new Dictionary{
{ ".apk", "application/vnd.android.package-archive" }
})
});ContentType可以查询我的另一篇文章:HTTP content-type
川公网安备 51010702003150号
留下您的脚步
最近评论