根据请求上下文动态设置静态文件存储目录

前言

上次,我们实现了根据 subpath 特定格式《动态设置静态文件存储目录》。

例如:

subpath静态文件路径
/userAId/1.jpgc:\abc\userAId\1.jpg
/userBId/1.jpgd:\xyz\123\userBId\1.jpg

但是,如果 subpath 不能有这种特定格式,只能用通用格式,比如https://<hostname>/StaticFiles/images/1.jpg

怎么实现?

思路

请求上下文肯定包含了信息能够区分出用户,比如 Session/Cookie、二级域名等,可以通过它来反向映射出静态文件路径。

例如:

二级域名静态文件路径
a.mycompany.comc:\abc\
b.mycompany.comd:\xyz\123

IFileProvider 接口实现中,我们获取不到当前请求上下文,但是中间件可以。

查看 UseStaticFiles 源代码,它使用的是 StaticFileMiddleware 中间件:

public static IApplicationBuilder UseStaticFiles(this IApplicationBuilder app, StaticFileOptions options)
{...return app.UseMiddleware<StaticFileMiddleware>(Options.Create(options));
}

查看 StaticFileMiddleware 源代码[1],它的关键实现是这个TryServeStaticFile 方法:

public class StaticFileMiddleware
{...private Task TryServeStaticFile(HttpContext context, string? contentType, PathString subPath){var fileContext = new StaticFileContext(context, _options, _logger, 
_fileProvider, contentType, subPath);if (!fileContext.LookupFileInfo()){_logger.FileNotFound(fileContext.SubPath);}else{// If we get here, we can try to serve the filereturn fileContext.ServeStaticFile(context, _next);}return _next(context);}
}

具体如何获取静态文件是依赖_fileProvider,因此,我们只需要替换 _fileProvider,换成根据请求上下文获取对应 PhysicalFileProvider 的方法即可。

实现

创建 MyIOStaticFileMiddleware,复制 StaticFileMiddleware 的原始代码,仅仅修改 TryServeStaticFile 方法:

public class MyIOStaticFileMiddleware
{...private Task TryServeStaticFile(HttpContext context, string? contentType, PathString subPath){var fileContext = new StaticFileContext(context, _options, _logger, 
GetPhysicalFileProvider(context), contentType, subPath);...return _next(context);}
}

然后根据 context 获取对应的 PhysicalFileProvider 进行处理:

private IFileProvider GetPhysicalFileProvider(HttpContext context)
{//实际可从数据库获取if (context.Request.Host.Host.StartsWith("a.mycompany.com")){return new PhysicalFileProvider(@"c:\abc");}if (context.Request.Host.Host.StartsWith("b.mycompany.com")){return new PhysicalFileProvider(@"d:\xyz\123");}...
}

使用

按如下方式配置静态文件中间件:

app.UseMiddleware<MyIOStaticFileMiddleware>();

运行效果如图:

56c8ec22a4afdd38632e088310344dff.gif

结论

今天,我们通过自定义 StaticFileMiddleware,实现了根据请求上下文动态设置静态文件存储目录。

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

参考资料

[1]

源代码: https://github.com/dotnet/aspnetcore/blob/main/src/Middleware/StaticFiles/src/StaticFileMiddleware.cs

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

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

相关文章

BZOJ3019 : [Balkan2012]handsome

首先预处理出$f[i][j][k]$表示长度为$i$的序列&#xff0c;第一个位置是$j$&#xff0c;最后一个位置是$k$时合法的方案数。 从后往前枚举LCP以及那个位置应该改成什么。 用线段树维护区间内最左最右的已经确定的位置&#xff0c;以及区间内的合法方案数。 合并的时候只需要将左…

php smarty入门,smarty 快速入门

smarty 快速入门smarty定义:一个开源的模板引擎模板引擎是为了使用户界面与业务数据分离而产生的&#xff0c;它可以生成特定格式的文档&#xff0c;用于网站的模板引擎就会生成一个标准的HTML文档。功能将网站的数据和网站的界面实现分离(php和html代码)缓存页面下载www.smart…

ImageView的scaleType理解

2019独角兽企业重金招聘Python工程师标准>>> 1.android:scaleType“center” 保持原图的大小&#xff0c;显示在ImageView的中心。当原图的size大于ImageView的size时&#xff0c;多出来的部分被截掉。 2.android:scaleType“center_inside” 以原图正常显示为目的&…

第一章 引论

1、什么是多道程序设计&#xff1f; 即内存中同时运行多道独立程序&#xff0c;宏观上所有程序同时运行&#xff0c;微观上程序串行&#xff0c;多道程序轮流占用CPU&#xff0c;提高了资源利用率。 2、什么是SPOOLING&#xff1f;读者是否认为将来的高级个人计算机会把SPOOLIN…

《ASP.NET Core 6框架揭秘》实例演示[24]:中间件的多种定义方式

ASP.NET Core的请求处理管道由一个服务器和一组中间件组成&#xff0c;位于 “龙头” 的服务器负责请求的监听、接收、分发和最终的响应&#xff0c;针对请求的处理由后续的中间件来完成。中间件最终体现为一个Func<RequestDelegate, RequestDelegate>委托&#xff0c;但…

Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载

为什么80%的码农都做不了架构师&#xff1f;>>> 随着 Google 推出了全新的设计语言 Material Design&#xff0c;还迎来了新的 Android 支持库 v7&#xff0c;其中就包含了 Material Design 设计语言中关于 Card 卡片概念的实现 —— CardView。RecyclerView也是谷…

php获取邮箱内容吗,php正则验证email邮箱及抽取内容中email的例子

1&#xff0c;php正则验证email格式&#xff1a;复制代码 代码示例:if (ereg(“/^[a-z]([a-z0-9]*[-_\.]?[a-z0-9])*([a-z0-9]*[-_]?[a-z0-9])[\.][a-z]{2,3}([\.][a-z]{2})?$/i; ”,$email)){echo “Your email address is correct!”;}else{echo “Please try again!”;}?…

Java——Arrays类操作数组的工具类

JDK中提供了一个专门用于操作数组的工具类&#xff0c;即 Arrays 类&#xff0c;位于 Java。util 包中。该类提供了一系列方法来操作数组&#xff0c;如排序、复制、比较、填充等&#xff0c;用户直接调用这些方法即可&#xff0c;不需要自己编码实现&#xff0c;降低了开发难度…

PropertiesUtil 获取文件属性值

有时候不要把一些属性值写死在代码中&#xff0c;而是写在配置在文件中&#xff0c;方便更改 PropertiesUtil工具类&#xff1a;读取key-value形式的配置文件&#xff0c;根据key获得value值 1、测试类 public class Test{private static PropertiesUtil propertiesUtil new …

CORS——跨域请求那些事儿

【本期嘉宾介绍】睿得&#xff0c;具有多年研发、运维、安全等IT相关从业经历。目前从事CDN、存储、视频直播点播的技术支持。喜爱钻研&#xff0c;喜爱编码&#xff0c;喜爱分享。 在日常的项目开发时会不可避免的需要进行跨域操作&#xff0c;而在实际进行跨域请求时&#xf…

oracle 数据执行计划,Oracle里常见的执行计划

本文介绍了Oracle数据库里常见的执行计划&#xff0c;使用的Oracle数据库版本为11.2.0.1。1、与表访问相关的执行计划Oracle数据库里与表访问有关的两种方法&#xff1a;全表扫描和ROWID扫描。反映在执行计划上&#xff0c;与全表扫描对应的执行计划中的关键字是“TABLE ACCESS…

.NET MAUI实战 Dispatcher

详细内容这一期分享的内容非常简单&#xff0c;在之前使用过WPF的开发者对MVVM开发模式下ViewModel中后台线程转UI线程并不陌生使用Appplication.Current.Dispatcher。那么在.NET MAUI中也有同样的机制&#xff0c;存在于.NET MAUI Shell对象中。那么什么是Shell&#xff1f;官…

GDB 配置

GDB 配置 使用 GDB 扩展来配置 GDB 事实上我还是觉得原生的 GDB 就挺好&#xff0c;速度快&#xff0c;需要查看什么执行命令就可以。 GDB DashBoard https://github.com/cyrus-and/gdb-dashboard $sudo mkdir -m 777 ~/gdbinit; cd ~/gdbinit $git clone https://github.com/c…

Oracle区分中文和英文,oracle中中英文段落划分实现

oracle中关于中文占用字节数&#xff0c;不同的数据库有不同的情况&#xff0c;有的占用两个字节、有的占用三个字节&#xff0c;现在测试环境的数据库中文占用三个字节&#xff0c;要实现由中英文组成的段落字符串&#xff0c;按照每行占用多少字节重新分段&#xff0c;具体应…

未来哪些行业值得加入?

阅读本文大概需要5分钟。这个问题很多读者都问过&#xff0c;基本上每隔几篇原创就会有人留言问&#xff0c;还有公众号后台和知乎私聊。之前在一次留言中我承诺专门开一篇文章来聊聊这个话题&#xff0c;今天想着要兑现这个诺言了。为啥最近会存在这个问题呢&#xff0c;原因其…

虚拟机网络配置详解(NAT、桥接、Hostonly)

VirtualBox中有四种网络连接方式: NATBridged AdapterInternalHost-only AdapterVMWare中有三种&#xff0c;其实它跟VMWare的网络连接方式都是一样的概念&#xff0c;只是比VMWare多了Internal方式 在介绍四种工作模式之前&#xff0c;先说下虚拟网卡&#xff0c;虚拟机安装好…

Oracle收款核销了怎么撤销,21应收收款-核销取消或核销调整

注&#xff1a;本课程不包含学习下载资料目标人群&#xff1a;1、Oracle ERP/EBS初级顾问和技术顾问&#xff1b; 1、Oracle ERP/EBS用户熟练学习ERP系统的基本设置功能&#xff1b; 2、Oracle ERP/EBS财务初级顾问的学习&#xff1b; 3、其他对Oracle ERP/EBS有兴趣的想转行如…

微软宣布正式开源 Azure IoT Edge 边缘计算服务

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; 微软宣布&#xff0c;去年年底公开预览的 Azure IoT Edge 边缘计算服务已进入官方版&#xff0c;并通过 GitHub 将其开源。Azure IoT Edge 主要将基于云的分析和定制的业务逻辑转移到边缘设备&a…

Windows下安装BeautifulSoup

电脑首先要安装好了python&#xff0c;我安装的是2.7。 下面就是bs4的安装过程了: 1.去官网下载BeautifulSoup4 2017.02.10目前最新版本&#xff1a;Beautiful Soup 4.3.2 2.解压文件 将下载得到的压缩包解压到任意文件夹&#xff0c;路径不含中文 3.打开cmd命令提示符 winr&am…

BZOJ1578: [Usaco2009 Feb]Stock Market 股票市场

S<50只股票D<10天的价格给出&#xff0c;求第一天开始用n<200000元最后能得到的最大钱数&#xff0c;保证答案<500000。 做D次完全背包即可&#xff0c;每次做完把dp数组清空。 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 #i…