Asp.Net Core 中的中的“虚拟目录虚拟目录”实现实现
写在前面写在前面
现在部署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;
评论0