如何在ASP.NET Core中自定义Azure Storage File Provider
主題:如何在ASP.NET Core中自定義Azure Storage File Provider
作者: Lamond Lu
地址: ?https://www.cnblogs.com/lwqlun/p/10406566.html
項(xiàng)目源代碼: https://github.com/lamondlu/AzureFileProvider
背景
ASP.NET Core是一個(gè)擴(kuò)展性非常高的框架,開(kāi)發(fā)人員可以根據(jù)自己的需求擴(kuò)展出想要的功能。File Provider是ASP.NET Core中的一個(gè)重要組件,通過(guò)這個(gè)組件,開(kāi)發(fā)人員可以暴露一組文件,并允許應(yīng)用程序像訪問(wèn)靜態(tài)文件一樣訪問(wèn)暴露的文件。
ASP.NET Core中內(nèi)置了3種File Provider
PhysicalFileProvider - 用來(lái)訪問(wèn)和應(yīng)用程序部署在一起的靜態(tài)文件
ManifestEmbeddedFileProvider - 用來(lái)訪問(wèn)程序集中的內(nèi)嵌文件
CompositeFileProvider - 將多個(gè)File Provider合并使用
那么如何自定義一個(gè)File Provider呢?比如如何將Azure Files Storage中的文件暴露給ASP.NET Core應(yīng)用程序。今天我們來(lái)演示一下,如果通過(guò)實(shí)現(xiàn)IFileProvider 接口來(lái)實(shí)現(xiàn)一個(gè)Azure Files Storage Provider。
本文中只針對(duì)Azure Files Storage, Azure Blob Storage的實(shí)現(xiàn)可以參見(jiàn)Filip w的博文
創(chuàng)建.NET Core Library項(xiàng)目
首先我們使用Visual Studio 2017,創(chuàng)建一個(gè)Class Library項(xiàng)目, 命名為AzureFileProvider
為了使用IFileProvider接口和Azure Storage服務(wù),這里我們需要使用Nuget引入2個(gè)庫(kù)
Microsoft.AspNetCore.App
WindowsAzure.Storage
創(chuàng)建AzureFileProvider
為了創(chuàng)建一個(gè)ASP.NET Core支持的File Provider, 我們就需要自己創(chuàng)建一個(gè)類,并讓它實(shí)現(xiàn)IFileProvider接口。
這里首先我們創(chuàng)建一個(gè)類AzureFileProvider, 它實(shí)現(xiàn)了IFileProvider接口
從以上代碼中,我們可以了解到,IFileProvider接口定義了3個(gè)需要實(shí)現(xiàn)方法
GetDirectoryContents - 這個(gè)方法是用來(lái)獲取指定目錄下的內(nèi)容的
GetFileInfo - 這個(gè)方法使用來(lái)獲取指定文件內(nèi)容的
Watch - 這個(gè)方法是用來(lái)監(jiān)聽(tīng)文件變更的,這個(gè)暫時(shí)不需要實(shí)現(xiàn)它
實(shí)現(xiàn)GetDirectoryContents方法
為了實(shí)現(xiàn)GetDirectoryContents方法,我們需要首先創(chuàng)建一個(gè)IDirectoryContents接口的實(shí)現(xiàn)類, 因?yàn)樗沁@個(gè)方法的返回類型。
我們創(chuàng)建一個(gè)類AzureStorageDirectoryContents, 它實(shí)現(xiàn)了IDirectoryContents接口。
代碼解釋:
這里IDirectoryContents其實(shí)就是為了顯示指定目錄中的文件結(jié)構(gòu)
IFileInfo接口對(duì)象既可以表示文件也可以表示子目錄,這個(gè)接口的2個(gè)實(shí)現(xiàn)我會(huì)在后面說(shuō)明
這里我們通過(guò)構(gòu)造函數(shù),將指定文件夾內(nèi)的文件結(jié)構(gòu)注入到了AzureStorageDirectoryContents雷中。
下面我們就可以來(lái)添加GetDirectoryContents方法的實(shí)現(xiàn)了。
代碼解釋:
這里我們通過(guò)構(gòu)造函數(shù)為AzureFileProvider類注入了一個(gè)Azure Files Storage強(qiáng)類型配置類AzureStorageSetting, 它的數(shù)據(jù)源是appSettings.json, 后續(xù)我們會(huì)通過(guò)強(qiáng)類型配置將其注入
GetRootDirectory方法是通過(guò)Azure Files Storage配置,獲得Azure Files Storage中文件集合的根目錄
GetDirectoryContents中subpath.Substring(1)代碼的作用是去除subpath帶的第一個(gè)“/”。如果不去除,會(huì)讀取不到文件
這里我們使用了ListFilesAndDirectoriesSegmentedAsync方法獲取了指定目錄中所有的文件和目錄
如果是文件,我們會(huì)實(shí)例化一個(gè)AzureFileInfo對(duì)象,如果是一個(gè)目錄,我們會(huì)實(shí)例化一個(gè)AzureDirectoryInfo對(duì)象
最終我們將讀取到的所有文件和目錄信息通過(guò)AzureStorageDirectoryContents類的構(gòu)造函數(shù)注入。
創(chuàng)建AzureFileInfo和AzureDirectoryInfo
為了區(qū)分文件和目錄,我們創(chuàng)建2個(gè)新類AzureFileInfo和AzureDirectoryInfo。 他們都實(shí)現(xiàn)了IFileInfo接口。
AzureFileInfo
代碼解釋
這里我們通過(guò)AzureFileInfo的構(gòu)造函數(shù)傳入了一個(gè)CloudFile對(duì)象, 這個(gè)對(duì)象將作為Name, PhysicalPath, LastModified等屬性的數(shù)據(jù)源。
我們使用CloudFile對(duì)象DownloadRangeToStreamAsync, 將其對(duì)應(yīng)的文件流下載。注意這里加載文件流之后,需要將文件流的Position置0(即流的頭部)
文件的長(zhǎng)度即文件流的長(zhǎng)度
強(qiáng)制設(shè)置IsDirectory屬性為false, 因?yàn)楫?dāng)前處理的是文件
AzureDirectoryInfo
代碼解釋
這里我們通過(guò)AzureDirectoryInfo的構(gòu)造函數(shù)傳入了一個(gè)CloudFileDirectory對(duì)象, 這個(gè)對(duì)象將作為Name, PhysicalPath, LastModified等屬性的數(shù)據(jù)源。
強(qiáng)制設(shè)置IsDirectory屬性為true, 因?yàn)楫?dāng)前處理的是目錄
這里我們沒(méi)有實(shí)現(xiàn)Length屬性和CreateReadStream, 因?yàn)槲覀兲幚淼氖悄夸? 這2個(gè)屬性沒(méi)有必要實(shí)現(xiàn)。
實(shí)現(xiàn)GetFileInfo方法
相對(duì)于GetDirectoryContents方法的實(shí)現(xiàn),GetFileInfo方法就簡(jiǎn)單多了,我們只需要根據(jù)當(dāng)前指定的subpath, 將文件信息返回即可。
如何啟用AzureFileProvider
下面我們來(lái)試驗(yàn)一下我們編寫的AzureFileProvider是否能運(yùn)行成功。
首先我們創(chuàng)建一個(gè)默認(rèn)ASP.NET Core Api項(xiàng)目,并引用上一步中編譯好的程序集AzureFileProvider.dll。
appSettings.json中, 我們需要定義Azure Files Storage的配置
例:
第二步,我們需要修改Startup.cs文件的Configure方法。
代碼解釋
這里我們使用強(qiáng)類型配置綁定,獲取了appSettings.json中的Azure Files Storage的配置
在配置靜態(tài)文件中間件部分,我們通過(guò)StaticFileOptions配置對(duì)象,指定了當(dāng)前應(yīng)用使用AzureFileProvider。
為了演示效果,我這里也啟用了DirectoryBrowser中間件,即可以使用網(wǎng)頁(yè)查看目錄結(jié)構(gòu)。這個(gè)功能比較危險(xiǎn),在正式項(xiàng)目很少使用。所以正式使用時(shí),最好將這段代碼刪掉。
最終效果
現(xiàn)在我們啟動(dòng)當(dāng)前項(xiàng)目, 訪問(wèn)"/files", 即可查看到當(dāng)前指定Azure Files Storage中的所有文件和目錄
項(xiàng)目源代碼
https://github.com/lamondlu/AzureFileProvider
Nuget程序集
以上類庫(kù),我已經(jīng)發(fā)布到了Nuget上, 如果你不想每次都把前面的代碼寫一遍,可以直接安裝這個(gè)程序集來(lái)使用。
Install-Package LamondLu.AzureFileProvider
總結(jié)
以上是生活随笔為你收集整理的如何在ASP.NET Core中自定义Azure Storage File Provider的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: k8s使用helm打包chart并上传到
- 下一篇: 美好生活从撸好代码开始