加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

Asp.Net Core 中的“假造目次”实现

发布时间:2021-05-30 03:13:57 所属栏目:编程 来源:互联网
导读:这篇文章首要先容了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" } ] }

建设对应的实体映射:

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读