怎么实现动态设置静态文件存储目录?
生活随笔
收集整理的這篇文章主要介紹了
怎么实现动态设置静态文件存储目录?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言
文章名字有點繞口,舉例說明一下:
多用戶使用同一個網站上傳文件,但是因為一些原因,文件需要存儲到服務器的不同目錄下。
比如用戶 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 反向映射出靜態文件路徑。
例如:
| /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“
總結
以上是生活随笔為你收集整理的怎么实现动态设置静态文件存储目录?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软 MVP 福利大赏
- 下一篇: Xamarin.Forms 5.0 项目