Asp.Net Core 中的“假造目次”实现
副问题[/!--empirenews.page--]
此刻陈设Asp.Net Core应用已经不再限定于Windows的IIS上,更多的是Docker容器、各类反向署理来陈设。也有少部门用IIS陈设的,IIS陈设确实是又快又简朴,图形化操纵三下五除二就可以宣布好一个辖档退。在已往Asp.Net MVC 项目陈设的时辰,还经常行使IIS一个成果——假造目次。 假造目次可以直接定位到非项目标其他路径,将路径作为网站的一部门,可实现上传文件生涯到其他盘符或间接的行使项目以外的静态文件。在Asp.Net MVC中从假造路径中存取文件也很简朴,如Server.MapPath("~/Upload/liohuang.jpg"); 但在Asp.Net Core上差异,它被抽象出一个“文件体系”,也就是FileProvider。FileProvider是对全部实现了IFileProvider接口的全部范例以及对应工具的统称,在Artech蒋先生的《.NET Core的文件体系[2]:FileProvider是个什么对象?》文章中已经透析了,这里不在罗里吧嗦了。 这篇文章要办理的内容是: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:test1mybook.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" } ] } 建设对应的实体映射: (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |