前言

文章名字有点绕口,举例说明一下:

多用户使用同一个网站上传文件,但是因为一些原因,文件需要存储到服务器的不同目录下。

比如用户 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“

怎么实现动态设置静态文件存储目录?相关推荐

  1. nano云存储 java,Nano云存储静态文件存储CDN和WDCDN免费CDN加速

    前一篇的七牛云存储国内免费CDN加速的文章,有朋友留言说又出现一个新的文件云存储服务:nano云存储,我一搜索还真是"新"出来的,谷歌官网都没有收录,反而异常的是百度收录了首页,再 ...

  2. 更改Google Chrome 用户文件存储目录User Data 最简单方法

    [size=medium][color=red]更改Google Chrome 用户文件存储目录User Data 最简单方法[/color] [color=green]1.在你想要存放数据的盘符下创 ...

  3. TortoiseSVN设置忽略文件和目录文件夹

    TortoiseSVN设置忽略文件和目录文件夹  在多数项目中你总会有文件和目录不需要进行版本控制.这可能包括一些由编译器生成的文件,*.obj,*.lst,或许是一个用于存放可执行程序的输出文件夹. ...

  4. ASP.NET Core使用静态文件、目录游览与MIME类型管理

    前言 今天我们来了解了解ASP.NET Core中的静态文件的处理方式. 以前我们寄宿在IIS中的时候,很多静态文件的过滤 和相关的安全措施 都已经帮我们处理好了. ASP.NET Core则不同,因 ...

  5. android uid文件存储目录,Android系统文件目录结构

    忍不住整理了一份自己喜欢的阅读风格 层次分明的Android文件目录,清晰的结构帮你更好的理解Android系统 有补充欢迎评论 |-3rdmodemnvm |-3rdmodemnvmbkp |-ac ...

  6. git设置忽略文件和目录

    1.登录gitbash命令端进入本地git库目录 Administrator@PC201601200946 MINGW32 /d/gitrespository/crmweb (master) 2.创建 ...

  7. mysql目录权限设置_MySQL文件及目录权限设置分析-爱可生

    1 背景 创建文件及目录时,我们会对相关的权限有一定的要求,默认的可以通过系统的umask来控制.然而,在我们使用MySQL时,无论是开始使用前的初始化,还是MySQL实例启动后,创建的相关文件及目录 ...

  8. git 忽略 部分文件夹_git设置忽略文件和目录

    1.登录gitbash命令端进入本地git库目录 Administrator@PC201601200946 MINGW32 /d/gitrespository/crmweb (master) 2.创建 ...

  9. dajngo3设置静态文件访问

    新建一个upload文件,并且在该文件夹内存放一张图片 setting.py文件里面需要设置 STATIC_URL = '/static/' #添加用户可以上传图片的文件夹 upload文件夹,这个是 ...

最新文章

  1. Android开发之品牌机型不同setMargins属性无效的bug
  2. 去除内存上的警告,避免程序崩掉
  3. 工作环境总结(1)开发环境搭建
  4. Opencv--从CalibrateCamera到SolvePnp(一)
  5. 数据结构(九)计数排序
  6. L3-008. 喊山-PAT团体程序设计天梯赛GPLT(广度优先搜索)
  7. 【工具】支付宝免费卡校验接口调用及常用银行简称整理
  8. 圆形连接器工业M8连接器M12连接器UL认证安装螺钉扭力测试国际IEC标准
  9. 在禁用uac_禁用仅管理员用户帐户控制(UAC)
  10. adm怎么下bt连接_迅雷不能下载版权敏感资源,试试这两款优秀的BT下载神器
  11. PS怎么把模糊的照片,变得更加清晰
  12. 淘集集官宣破产,创业不易,且行且珍惜
  13. 让秒杀狂欢更从容:大促背后的数据库(下篇)
  14. Java动态初始化数组,元素默认值规则
  15. cjk-ext-e 字体
  16. mv150us无线网卡驱动linux,水星MW150US安装Linux驱动
  17. java 分页简单使用
  18. 七月学习之E6、ES7、ES8、ES9、ES10、ES11新特性
  19. 用计算机设计购物小票,商友星云系统软件票据和条码标签设计和打印
  20. java计算机毕业设计基于springboot+vue+elementUI的旅游网站(源码+数据库+Lw文档)

热门文章

  1. java eleven进度条
  2. Ruby如何成长成高性能系统构架
  3. hdu4750Count The Pairs(最小生成树找瓶颈边)
  4. 《信息存储与管理》读书笔记7 存储虚拟化
  5. java wsdl xfire_java调用wsdl xfire和cxf两种方式
  6. (3)Python3笔记之变量与运算符
  7. struts2开发action 的三种方法以及通配符、路径匹配原则、常量
  8. leetCode 53. maximum subarray
  9. 【Zookeeper】源码分析之服务器(一)
  10. 十六、Struts2文件上传与下载