这期内容当中小编将会给大家带来有关怎么在Asp.Net Core项目中实现一个虚拟目录,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
首先,新建一个.Net Core WebApi空项目部署在D盘,“虚拟目录”假设物理路径在F盘,分别创建三个测试目录:F:/test1、F:/test2和F:/test3,目录里分别存放对应的文件1/2/3.jpg和mybook.txt。
在Startup.ConfigureServices注入IFileProvider:
services.AddSingleton<IFileProvider>(new PhysicalFileProvider("F:\\test1"));
新建一个控制器,读取mybook.txt中的内容:
[ApiController]
[Route("[controller]/[action]")]
public class LioHuangController : ControllerBase
{
[HttpGet]
public object GetFiles([FromServices]IFileProvider fileProvider)
{
var file = fileProvider.GetFileInfo("mybook.txt");
if (file.Exists)
{
return ReadTxtContent(file.PhysicalPath);
}
return 0;
}
/// <summary>
/// 读取文本 (原文地址:https://www.cnblogs.com/EminemJK/p/13362368.html)
/// </summary>
private string ReadTxtContent(string Path)
{
if (!System.IO.File.Exists(Path))
{
return "Not found!";
}
using (StreamReader sr = new StreamReader(Path, Encoding.UTF8))
{
StringBuilder sb = new StringBuilder();
string content;
while ((content = sr.ReadLine()) != null)
{
sb.Append(content);
}
return sb.ToString();
}
}
}
访问接口,接口读取文件之后,返回内容:
IFileProvider接口采用目录来组织文件,并统一使用IFileInfo接口来表示,PhysicalPath表示文件的物理路径。
public interface IFileInfo
{
bool Exists { get; }
bool IsDirectory { get; }
DateTimeOffset LastModified { get; }
string Name { get; }
string PhysicalPath { get; }
Stream CreateReadStream();
}
如多个虚拟目录,怎么处理?简单,注入多个IFileProvider即可,
services.AddSingleton<IFileProvider>(new PhysicalFileProvider("F:\\test1"));
services.AddSingleton<IFileProvider>(new PhysicalFileProvider("F:\\test2"));
services.AddSingleton<IFileProvider>(new PhysicalFileProvider("F:\\test3"));
代码修改为:
public object GetFiles([FromServices] IEnumerable<IFileProvider> fileProviders)
IEnumerable<IFileProvider> fileProviders接口数组将会有三个,按注入的顺序对应不同的目录。当然,注入IFileProvider的时候,就可以封装一层了,下面再讲。
另外,有的说直接ReadTxtContent("F:\test1\mybook.txt");不香吗?香,Asp.Net Core的访问权限要比Asp.Net MVC之前老版本项目要高许多,确实是可以直接读取项目以外的文件,但是并不适合直接去访问,除非说你只有一个地方使用到,那么就可以直接读取,但静态的文件的访问,就访问不到了,仅仅是后台读取而已。所以统一使用IFileProvider来约束,代码的可维护性要高许多。
在Startup.Configure设置静态文件目录,即可:
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider("F:\\test1"),
RequestPath = "/test"
});;
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider("F:\\test2"),
RequestPath = "/test"
});
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider("F:\\test3"),
RequestPath = "/test"
});
FileProvider同上面所说的,设置好物理路径的根目录,RequestPath则是访问路径的前缀,必须是斜杆“/”开头,访问地址前缀则为:https://localhost:5001/test/。设置好之后,就可以访问项目以外的路径了。
如在IIS部署的时候 ,可以直接忽略IIS中的虚拟目录设置,完完全全可以通过注入的配置来设置达到“虚拟目录”的效果。
为了方便达到真实项目中可以直接使用,那么就要设置为可配置的:
在appsettings.json中设置:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*",
"VirtualPath": [
{
"RealPath": "F:\\test1", //真实路径
"RequestPath": "/test",
"Alias": "first"
},
{
"RealPath": "F:\\test2", //真实路径
"RequestPath": "/test",
"Alias": "second"
},
{
"RealPath": "F:\\test3", //真实路径
"RequestPath": "/test",
"Alias": "third"
}
]
}
创建对应的实体映射:
public class VirtualPathConfig
{
public List<PathContent> VirtualPath { get; set; }
}
public class PathContent
{
public string RealPath { get; set; }
public string RequestPath { get; set; }
public string Alias { get; set; }
}
在PhysicalFileProvider上封装一层,加入别名便于获取:
public class MyFileProvider : PhysicalFileProvider
{
public MyFileProvider(string root, string alias) : base(root)
{
this.Alias = alias;
}
public MyFileProvider(string root, Microsoft.Extensions.FileProviders.Physical.ExclusionFilters filters, string alias) : base(root, filters)
{
this.Alias = alias;
}
/// <summary>
/// 别名
/// </summary>
public string Alias { get; set; }
}
调整Startup.ConfigureServices和Startup.Configure:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.Configure<VirtualPathConfig>(Configuration);
var config = Configuration.Get<VirtualPathConfig>().VirtualPath;
config.ForEach(f =>
{
services.AddSingleton(new MyFileProvider(f.RealPath,f.Alias));
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
var config = Configuration.Get<VirtualPathConfig>().VirtualPath;
config.ForEach(f =>
{
app.UseStaticFiles(new StaticFileOptions()
{
FileProvider = new PhysicalFileProvider(f.RealPath),
RequestPath =f.RequestPath
});
});
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
最后,调整调用方式,即可。
[HttpGet]
public object GetFiles([FromServices] IEnumerable<MyFileProvider> fileProviders)
{
var file = fileProviders.FirstOrDefault(x=>x.Alias=="first").GetFileInfo("mybook.txt");
if (file.Exists)
{
return ReadTxtContent(file.PhysicalPath);
}
return 0;
}
上述就是小编为大家分享的怎么在Asp.Net Core项目中实现一个虚拟目录了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。