怎么实现动态设置静态文件存储目录?
前言
文章名字有点绕口,举例说明一下:
多用户使用同一个网站上传文件,但是因为一些原因,文件需要存储到服务器的不同目录下。
比如用户 A 对应
c:\abc
,用户 B 对应d:\xyz\123
。并且,文件需要以静态文件方式提供访问。
由于每个用户的静态文件存储目录不同,这就需要根据用户当前请求动态确定存储目录。
怎么实现?
思路
默认情况下,静态文件存储在项目的 Web 根目录中。默认目录为 {content root}/wwwroot
。
如果要使用其他目录,可以按如下方式配置静态文件中间件:
app.UseStaticFiles(new StaticFileOptions
{FileProvider = new PhysicalFileProvider(@"c:\abc")
});
查看 FileProvider
属性,它是 IFileProvider
接口的实例:
public interface IFileProvider
{IFileInfo GetFileInfo(string subpath);...
}
其中,subpath
是相对于 Web 根目录的标识文件的相对路径:
https://<hostname>/StaticFiles/images/red-rose.jpg//subpath
/StaticFiles/images/red-rose.jpg//静态文件路径
c:\abc\StaticFiles\images\red-rose.jpg
如果 subpath
有规律(比如以用户 Id
为第一级子目录),我们可以实现自定义 IFileProvider
,通过 subpath
反向映射出静态文件路径。
例如:
subpath | 静态文件路径 |
---|---|
/userAId/1.jpg | c:\abc\userAId\1.jpg |
/userBId/1.jpg | d:\xyz\123\userBId\1.jpg |
实现
创建 MyIOFileProvider
,代码如下:
public class MyIOFileProvider : IFileProvider
{public IDirectoryContents GetDirectoryContents(string subpath){return GetPhysicalFileProvider(subpath).GetDirectoryContents(subpath);}public IFileInfo GetFileInfo(string subpath){return GetPhysicalFileProvider(subpath).GetFileInfo(subpath);}public IChangeToken Watch(string filter){return null;}
}
然后根据 subpath
获取对应的 PhysicalFileProvider
进行处理:
private PhysicalFileProvider GetPhysicalFileProvider(string subpath)
{//实际可从数据库获取if (subpath.StartsWith("/1/")){return new PhysicalFileProvider(@"c:\abc");}if (subpath.StartsWith("/2/")){return new PhysicalFileProvider(@"d:\xyz\123");}...
}
使用
按如下方式配置静态文件中间件:
app.UseStaticFiles(new StaticFileOptions
{FileProvider = new MyIOFileProvider()
});
运行效果如图:
结论
今天,我们通过自定义 IFileProvider
,实现了动态设置静态文件存储目录。
想了解更多内容,请关注我的个人公众号”My IO“
怎么实现动态设置静态文件存储目录?相关推荐
- nano云存储 java,Nano云存储静态文件存储CDN和WDCDN免费CDN加速
前一篇的七牛云存储国内免费CDN加速的文章,有朋友留言说又出现一个新的文件云存储服务:nano云存储,我一搜索还真是"新"出来的,谷歌官网都没有收录,反而异常的是百度收录了首页,再 ...
- 更改Google Chrome 用户文件存储目录User Data 最简单方法
[size=medium][color=red]更改Google Chrome 用户文件存储目录User Data 最简单方法[/color] [color=green]1.在你想要存放数据的盘符下创 ...
- TortoiseSVN设置忽略文件和目录文件夹
TortoiseSVN设置忽略文件和目录文件夹 在多数项目中你总会有文件和目录不需要进行版本控制.这可能包括一些由编译器生成的文件,*.obj,*.lst,或许是一个用于存放可执行程序的输出文件夹. ...
- ASP.NET Core使用静态文件、目录游览与MIME类型管理
前言 今天我们来了解了解ASP.NET Core中的静态文件的处理方式. 以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好了. ASP.NET Core则不同,因 ...
- android uid文件存储目录,Android系统文件目录结构
忍不住整理了一份自己喜欢的阅读风格 层次分明的Android文件目录,清晰的结构帮你更好的理解Android系统 有补充欢迎评论 |-3rdmodemnvm |-3rdmodemnvmbkp |-ac ...
- git设置忽略文件和目录
1.登录gitbash命令端进入本地git库目录 Administrator@PC201601200946 MINGW32 /d/gitrespository/crmweb (master) 2.创建 ...
- mysql目录权限设置_MySQL文件及目录权限设置分析-爱可生
1 背景 创建文件及目录时,我们会对相关的权限有一定的要求,默认的可以通过系统的umask来控制.然而,在我们使用MySQL时,无论是开始使用前的初始化,还是MySQL实例启动后,创建的相关文件及目录 ...
- git 忽略 部分文件夹_git设置忽略文件和目录
1.登录gitbash命令端进入本地git库目录 Administrator@PC201601200946 MINGW32 /d/gitrespository/crmweb (master) 2.创建 ...
- dajngo3设置静态文件访问
新建一个upload文件,并且在该文件夹内存放一张图片 setting.py文件里面需要设置 STATIC_URL = '/static/' #添加用户可以上传图片的文件夹 upload文件夹,这个是 ...
最新文章
- Android开发之品牌机型不同setMargins属性无效的bug
- 去除内存上的警告,避免程序崩掉
- 工作环境总结(1)开发环境搭建
- Opencv--从CalibrateCamera到SolvePnp(一)
- 数据结构(九)计数排序
- L3-008. 喊山-PAT团体程序设计天梯赛GPLT(广度优先搜索)
- 【工具】支付宝免费卡校验接口调用及常用银行简称整理
- 圆形连接器工业M8连接器M12连接器UL认证安装螺钉扭力测试国际IEC标准
- 在禁用uac_禁用仅管理员用户帐户控制(UAC)
- adm怎么下bt连接_迅雷不能下载版权敏感资源,试试这两款优秀的BT下载神器
- PS怎么把模糊的照片,变得更加清晰
- 淘集集官宣破产,创业不易,且行且珍惜
- 让秒杀狂欢更从容:大促背后的数据库(下篇)
- Java动态初始化数组,元素默认值规则
- cjk-ext-e 字体
- mv150us无线网卡驱动linux,水星MW150US安装Linux驱动
- java 分页简单使用
- 七月学习之E6、ES7、ES8、ES9、ES10、ES11新特性
- 用计算机设计购物小票,商友星云系统软件票据和条码标签设计和打印
- java计算机毕业设计基于springboot+vue+elementUI的旅游网站(源码+数据库+Lw文档)