1、默认
默认情况下,在webapi项目中使用 UseStaticFiles 或者 UseFileServer即可顺便托管wwwroot静态资源,也可以设置defaultFileProvider选项定位到自定义文件夹,比如
FileServerOptions options = new FileServerOptions{ FileProvider = PhysicalFileProvider("自定义根目录"), EnableDefaultFiles = true, EnableDirectoryBrowsing = false,};app.UseFileServer(options);2、动态多目录
通过实现IFileProvider接口,包一层,实现根据域名或者path选择不同的PhysicalFileProvider来访问不同的根目录
配置
builder.Services.AddHttpContextAccessor();builder.Services.AddSingleton<DynamicFileProvider>();IHttpContextAccessor httpContextAccessor = app.Services.GetService<IHttpContextAccessor >()DynamicFileProvider dfp = app.Services.GetService<DynamicFileProvider>();//设置一个默认目录dfp.SetDefault(Path.Combine(app.Environment.ContentRootPath, "web"));FileServerOptions options = new FileServerOptions{ FileProvider = dfp, EnableDefaultFiles = true, EnableDirectoryBrowsing = false,};app.UseFileServer(options);实现接口
public class DynamicFileProvider : IFileProvider{ private PhysicalFileProvider defaultFileProvider; private readonly IHttpContextAccessor httpContextAccessor; public DynamicFileProvider(IHttpContextAccessor httpContextAccessor) { this.httpContextAccessor = httpContextAccessor; SearchTask(); } public void SetDefault(string defaultPath) { if (Directory.Exists(defaultPath) == false) { Directory.CreateDirectory(defaultPath); } this.defaultFileProvider = new PhysicalFileProvider(defaultPath); } public IFileInfo GetFileInfo(string subpath) { IFileProvider fileProvider = GetFileProvider(); return fileProvider.GetFileInfo(subpath); } public IDirectoryContents GetDirectoryContents(string subpath) { IFileProvider fileProvider = GetFileProvider(); return fileProvider.GetDirectoryContents(subpath); } public IChangeToken Watch(string filter) { IFileProvider fileProvider = GetFileProvider(); return fileProvider.Watch(filter); } private IFileProvider GetFileProvider() { HttpContext httpContext = httpContextAccessor.HttpContext; string host = httpContext?.Request.Host.Host ?? string.Empty; string path = httpContext?.Request.Path ?? string.Empty; FileProviderInfo provider; if (IPAddress.TryParse(host, out _) == false) { //根据 host.Split('.')[0] 获取 } if (string.IsNullOrWhiteSpace(path) == false) { //根据 path.Split('/')[1] 获取 } //都没有就默认的 return defaultFileProvider; }}
支付宝微信扫一扫,打赏作者吧~
