怎么实现动态设置静态文件存储目录?
前言
文章名字有點繞口,舉例說明一下:
多用戶使用同一個網(wǎng)站上傳文件,但是因為一些原因,文件需要存儲到服務器的不同目錄下。
比如用戶 A 對應 c:\abc,用戶 B 對應 d:\xyz\123。
并且,文件需要以靜態(tài)文件方式提供訪問。
由于每個用戶的靜態(tài)文件存儲目錄不同,這就需要根據(jù)用戶當前請求動態(tài)確定存儲目錄。
怎么實現(xiàn)?
思路
默認情況下,靜態(tài)文件存儲在項目的 Web 根目錄中。默認目錄為 {content root}/wwwroot。
如果要使用其他目錄,可以按如下方式配置靜態(tài)文件中間件:
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//靜態(tài)文件路徑 c:\abc\StaticFiles\images\red-rose.jpg如果 subpath 有規(guī)律(比如以用戶 Id 為第一級子目錄),我們可以實現(xiàn)自定義 IFileProvider,通過 subpath 反向映射出靜態(tài)文件路徑。
例如:
| /userAId/1.jpg | c:\abc\userAId\1.jpg |
| /userBId/1.jpg | d:\xyz\123\userBId\1.jpg |
實現(xiàn)
創(chuàng)建 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;} }然后根據(jù) subpath 獲取對應的 PhysicalFileProvider 進行處理:
private?PhysicalFileProvider?GetPhysicalFileProvider(string?subpath) {//實際可從數(shù)據(jù)庫獲取if?(subpath.StartsWith("/1/")){return?new?PhysicalFileProvider(@"c:\abc");}if?(subpath.StartsWith("/2/")){return?new?PhysicalFileProvider(@"d:\xyz\123");}... }使用
按如下方式配置靜態(tài)文件中間件:
app.UseStaticFiles(new?StaticFileOptions {FileProvider?=?new?MyIOFileProvider() });運行效果如圖:
結(jié)論
今天,我們通過自定義 IFileProvider,實現(xiàn)了動態(tài)設(shè)置靜態(tài)文件存儲目錄。
想了解更多內(nèi)容,請關(guān)注我的個人公眾號”My IO“
總結(jié)
以上是生活随笔為你收集整理的怎么实现动态设置静态文件存储目录?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软 MVP 福利大赏
- 下一篇: Xamarin.Forms 5.0 项目