日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

如何在ASP.NET Core中自定义Azure Storage File Provider

發(fā)布時(shí)間:2023/12/4 asp.net 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何在ASP.NET Core中自定义Azure Storage File Provider 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

主題:如何在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中文件集合的根目錄

  • GetDirectoryContentssubpath.Substring(1)代碼的作用是去除subpath帶的第一個(gè)“/”。如果不去除,會(huì)讀取不到文件

  • 這里我們使用了ListFilesAndDirectoriesSegmentedAsync方法獲取了指定目錄中所有的文件和目錄

  • 如果是文件,我們會(huì)實(shí)例化一個(gè)AzureFileInfo對(duì)象,如果是一個(gè)目錄,我們會(huì)實(shí)例化一個(gè)AzureDirectoryInfo對(duì)象

  • 最終我們將讀取到的所有文件和目錄信息通過(guò)AzureStorageDirectoryContents類的構(gòu)造函數(shù)注入。

創(chuàng)建AzureFileInfoAzureDirectoryInfo

為了區(qū)分文件和目錄,我們創(chuàng)建2個(gè)新類AzureFileInfoAzureDirectoryInfo。 他們都實(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。