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

前言

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

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

比如用户 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.jpgc:\abc\userAId\1.jpg
/userBId/1.jpgd:\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()
});

运行效果如图:

4e10401dbf693a99cc4213f4d75e1e1f.gif

结论

今天,我们通过自定义 IFileProvider,实现了动态设置静态文件存储目录。

想了解更多内容,请关注我的个人公众号”My IO“

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编写函数判断一个数是否是回文数_程序员面试金典 - 面试题 01.04. 回文排列

题目难度: 简单原题链接 题目描述给定一个字符串&#xff0c;编写一个函数判定其是否为某个回文串的排列之一。回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。回文串不一定是字典当中的单词。示例 1&#xff1a;输入&#xff1a;"tactcoa" 输出…

Facebook为Messenger应用添加群组付款功能

Facebook在2015年为Messenger应用添加了好友免费转账功能。这个使得用户可以方便安全地向朋友转账&#xff0c;但是如果用户需要向多人支付&#xff0c;可能会耗费时间。幸运的是&#xff0c;Facebook已经通过其最新的Messenger应用更新解决了这个缺点。扩展付款功能现在允许用…

Xamarin.Forms 5.0 项目实战发布!

活动介绍本次活动主要是 .NET Xamarin.Forms 移动端项目开发实战教程, 与以往相同, 本次的收入(其它部分会另行说明) 将用于社区公益活动, 不限于:公益性质的个人/组织机构捐赠开源社区个人/项目捐赠内部投票活动本次的活动费用为:399元, 相对于去年组织的WPF公益实战视频而言,…

unity webgl读写txt文件_VB 读写txt文件

No.7 读写txt文件​mp.weixin.qq.com许多程序需要读写数据&#xff0c;比如商品管理&#xff0c;图书管理&#xff0c;学生档案等&#xff0c;当需要查询的时候&#xff0c;就是读取数据&#xff0c;新增或者更改就需要写数据&#xff0c;VB来讲&#xff0c;中小型的数据一般用…

地图投影系列介绍(一)----地球空间模型

1、现实世界和坐标空间的联系 任何空间特征都表示为地球表面的一个特定位置,而位置依赖于既定的坐标系来表示。 通过统一的坐标系和高程系,可以使不同源的GIS数据叠加在一起显示,以及执行空间分析。 2、地球空间模型描述

layui 数字步进器_图解全新奔驰S级:从“传统豪华”向“数字豪华”转型

全新奔驰S级的全球首发&#xff0c;中国这次也同步进行亮相。而且在全球首发之前的6个小时&#xff0c;就邀请了中国媒体提早进行品鉴。讲真&#xff0c;虽然之前我也不看好新S级&#xff0c;尤其是此前不知道在哪里泄露出来的图片&#xff0c;看着这台车的气场远不及W222来得强…

C# 一个基于.NET Core3.1的开源项目帮你彻底搞懂WPF框架Prism

--概述这个项目演示了如何在WPF中使用各种Prism功能的示例。如果您刚刚开始使用Prism&#xff0c;建议您从第一个示例开始&#xff0c;按顺序从列表中开始。每个示例都基于前一个示例的概念。此项目平台框架&#xff1a;.NET Core 3.1Prism版本&#xff1a;8.0.0.1909提示&…

地图投影系列介绍(二)----地理坐标系

3、地理坐标系 地球的形状与大小确定之后,还必须确定椭球体与大地水准面的相对关系,这项工作称为椭球定位与定向。与大地水准面符合得最好的一个地球椭球体,称为参考椭球体,是地球形体三级逼近。 说到这里,我们需要对这几个词汇做区分:

同一个工作组无法查看计算机,win7系统在同一个工作组看不到其他电脑的解决方法...

很多小伙伴都遇到过win7系统点击右键保存图片时没有另存为选项该的困惑吧&#xff0c;一些朋友看过网上零散的win7系统点击右键保存图片时没有另存为选项该的处理方法&#xff0c;并没有完完全全明白win7系统点击右键保存图片时没有另存为选项该是如何解决的&#xff0c;今天小…

bootstrap 开源框架demo_5 个接私活必备的 Java 开源项目!

公众号关注 “GitHubDaily”设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01;大家好&#xff0c;我是 Guide 哥&#xff0c;一个三观比主角还正的技术人。今天推荐几个 Java 项目快速开发脚手架&#xff0c;解放双手 ✋ 从现在开始。以下推荐项目都是码云上的优质项目&…

C#隐藏桌面图标和任务栏

最近因为项目需要需要实现桌面图标和任务状态栏的隐藏功能&#xff0c;实现的方式很多&#xff0c;比如修改注册表值&#xff0c;调用windows API函数等。经过一番的查阅&#xff0c;这个功能暂时实现了&#xff0c;或许不是很好的方法&#xff0c;但是我预期的效果达到了&…

CacheManager - 用 C# 编写的 .NET 的开源缓存抽象层

简介CacheManager 是用 C# 编写的 .NET 的开源缓存抽象层。它支持各种缓存提供程序并实现了许多高级功能CacheManager 是用 C# 编写的 .NET 的开源缓存抽象层。它支持各种缓存提供程序并实现了许多高级功能。CacheManager 包的主要目标是让开发人员的生活更容易处理&#xff0c…

这些Intel Atom处理器千万别升Windows 10创意者更新:不兼容

Windows 10创意者更新已经发布&#xff0c;目前的升级方式包括使用Windows 10易升、官方临时链接和MSDNITELLYOU的直链。不过&#xff0c;微软已经给出警告&#xff0c;Intel Clover Trail家族的处理器暂时不支持Windows 10创意者更新&#xff0c;万勿升级&#xff0c;涉及的型…

华中科技大学计算机学院2020直博生名单,华中科技大学各院系2020年博士研究生“申请-考核”制拟录取名单公示...

原标题&#xff1a;华中科技大学各院系2020年博士研究生“申请-考核”制拟录取名单公示根据教育部相关通知要求&#xff0c;结合学校2020年博士“申请-考核”制招生录取工作实际&#xff0c;经各学院研究生招生工作领导小组审核&#xff0c;现陆续发布各院系博士研究生“申请-考…

文档大小超出上传限制怎么办_压缩PDF大小该怎么操作?压缩PDF的软件有哪些?...

压缩PDF大小该怎么操作&#xff1f;工作中使用的任何设备的储存空间都是有限制的&#xff0c;为了能让自己的电脑储存更多的文件&#xff0c;我们可以将多个PDF文件进行压缩再存储。那么我怎么压缩PDF文件呢&#xff1f;下面就小编就来告诉大家压缩PDF文件的好办法。方法一&…

2015 Spark 将走向哪里?

在刚刚过去的spark submit上&#xff0c;Matei Zahara简单回顾了下2014年spark的发展&#xff0c;可用一个词来概括那就是"Amazing"!!! 那么2015年&#xff0c;spark 将主要精力放在哪些方面呢&#xff1f; 一个是数据科学&#xff0c;即提供更高级的API接口&#xf…

char添加一个字符_给你五十行代码把图片变成字符画!程序:太多了,一半都用不完...

今天和大家分享一个简单又好玩的Python项目–“图片转字符画”。废话不多说&#xff0c;先上一个效果图迷惑一下众生。没错的&#xff0c;图片转字符画就是将我们平常所看到的的图片根据像素RGB值和灰度值传化成一个个字符串的过程。嗯…听起来有些费脑子喔。没关系&#xff0c…

oom 如何避免 高并发_微博短视频百万级高可用、高并发架构如何设计?

本文从设计及服务可用性方面&#xff0c;详细解析了微博短视频高可用、高并发架构设计中的问题与解决方案。今天与大家分享的是微博短视频业务的高并发架构&#xff0c;具体内容分为如下三个方面&#xff1a;团队介绍微博视频业务场景“微博故事”业务场景架构设计团队介绍我们…

免费都不管用,Win10升级在中国怎么就这么难?

天下没有免费的午餐&#xff0c;如果有&#xff0c;那也是限时免费。不过&#xff0c;被地摊光盘浸淫十多年的中国民众&#xff0c;这次却对微软的免费分外冷淡。 就在7月26日这天&#xff0c;距离Windows 10免费升级还剩下最后三天&#xff0c;微软发了一份怨念深重的声明——…

在非k8s 环境下 的应用 使用 Dapr Sidekick for .NET

在k8s 环境下&#xff0c;通过Operator 可以管理Dapr sidecar&#xff0c; 在虚拟机环境下&#xff0c;我们也是非常需要这样的一个管理组件&#xff0c;之前写的一篇文章《 在 k8s 以外的分布式环境中使用 Dapr》 里面介绍了一个案例Dapr case study: Man Group&#xff1a;ht…