根據請求上下文動態設置靜態文件存儲目錄

前言

上次,我們實現了根據 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.pswp.cn/news/282906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282906.shtml
英文地址,請注明出處:http://en.pswp.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…