asp綁定gridview屬性_如何在ASP.NET Core中自定義Azure Storage File Provider

主題:如何在ASP.NET Core中自定義Azure Storage File Provider

作者: Lamond Lu

地址: ?https://www.cnblogs.com/lwqlun/p/10406566.html

項目源代碼: https://github.com/lamondlu/AzureFileProvider

55e98eea42f890368442eba2fdc2e5d8.png

背景

ASP.NET Core是一個擴展性非常高的框架,開發人員可以根據自己的需求擴展出想要的功能。File Provider是ASP.NET Core中的一個重要組件,通過這個組件,開發人員可以暴露一組文件,并允許應用程序像訪問靜態文件一樣訪問暴露的文件。

ASP.NET Core中內置了3種File Provider

  • PhysicalFileProvider - 用來訪問和應用程序部署在一起的靜態文件

  • ManifestEmbeddedFileProvider - 用來訪問程序集中的內嵌文件

  • CompositeFileProvider - 將多個File Provider合并使用

那么如何自定義一個File Provider呢?比如如何將Azure Files Storage中的文件暴露給ASP.NET Core應用程序。今天我們來演示一下,如果通過實現IFileProvider 接口來實現一個Azure Files Storage Provider。

本文中只針對Azure Files Storage, Azure Blob Storage的實現可以參見Filip w的博文

創建.NET Core Library項目

首先我們使用Visual Studio 2017,創建一個Class Library項目, 命名為AzureFileProvider

5cd5263c51f42beba5c2105cc39d0ac0.png

為了使用IFileProvider接口和Azure Storage服務,這里我們需要使用Nuget引入2個庫

  • Microsoft.AspNetCore.App

  • WindowsAzure.Storage

創建AzureFileProvider

為了創建一個ASP.NET Core支持的File Provider, 我們就需要自己創建一個類,并讓它實現IFileProvider接口。

這里首先我們創建一個類AzureFileProvider, 它實現了IFileProvider接口

f153ccf6c760fc906289f66e75b125e7.png

從以上代碼中,我們可以了解到,IFileProvider接口定義了3個需要實現方法

  • GetDirectoryContents - 這個方法是用來獲取指定目錄下的內容的

  • GetFileInfo - 這個方法使用來獲取指定文件內容的

  • Watch - 這個方法是用來監聽文件變更的,這個暫時不需要實現它

實現GetDirectoryContents方法

為了實現GetDirectoryContents方法,我們需要首先創建一個IDirectoryContents接口的實現類, 因為它是這個方法的返回類型。

我們創建一個類AzureStorageDirectoryContents, 它實現了IDirectoryContents接口。

ab7a23f9bf33a0bd9167279a60e645f2.png

代碼解釋:

  • 這里IDirectoryContents其實就是為了顯示指定目錄中的文件結構

  • IFileInfo接口對象既可以表示文件也可以表示子目錄,這個接口的2個實現我會在后面說明

  • 這里我們通過構造函數,將指定文件夾內的文件結構注入到了AzureStorageDirectoryContents雷中。

下面我們就可以來添加GetDirectoryContents方法的實現了。

d2728c2404f0a023967df85b9ba52ff1.png

代碼解釋:

  • 這里我們通過構造函數為AzureFileProvider類注入了一個Azure Files Storage強類型配置類AzureStorageSetting, 它的數據源是appSettings.json, 后續我們會通過強類型配置將其注入

  • GetRootDirectory方法是通過Azure Files Storage配置,獲得Azure Files Storage中文件集合的根目錄

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

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

  • 如果是文件,我們會實例化一個AzureFileInfo對象,如果是一個目錄,我們會實例化一個AzureDirectoryInfo對象

  • 最終我們將讀取到的所有文件和目錄信息通過AzureStorageDirectoryContents類的構造函數注入。

創建AzureFileInfoAzureDirectoryInfo

為了區分文件和目錄,我們創建2個新類AzureFileInfoAzureDirectoryInfo。 他們都實現了IFileInfo接口。

AzureFileInfo

8d2fdf3315a5c6540803b135b9be2605.png

代碼解釋

  • 這里我們通過AzureFileInfo的構造函數傳入了一個CloudFile對象, 這個對象將作為Name, PhysicalPath, LastModified等屬性的數據源。

  • 我們使用CloudFile對象DownloadRangeToStreamAsync, 將其對應的文件流下載。注意這里加載文件流之后,需要將文件流的Position置0(即流的頭部)

  • 文件的長度即文件流的長度

  • 強制設置IsDirectory屬性為false, 因為當前處理的是文件

AzureDirectoryInfo

27968ca2b32c3b8686fbf324c1789a3e.png

代碼解釋

  • 這里我們通過AzureDirectoryInfo的構造函數傳入了一個CloudFileDirectory對象, 這個對象將作為Name, PhysicalPath, LastModified等屬性的數據源。

  • 強制設置IsDirectory屬性為true, 因為當前處理的是目錄

  • 這里我們沒有實現Length屬性和CreateReadStream, 因為我們處理的是目錄, 這2個屬性沒有必要實現。

實現GetFileInfo方法

相對于GetDirectoryContents方法的實現,GetFileInfo方法就簡單多了,我們只需要根據當前指定的subpath, 將文件信息返回即可。

16874d146d35c042c73225b1a3636c19.png

如何啟用AzureFileProvider

下面我們來試驗一下我們編寫的AzureFileProvider是否能運行成功。

首先我們創建一個默認ASP.NET Core Api項目,并引用上一步中編譯好的程序集AzureFileProvider.dll。

appSettings.json中, 我們需要定義Azure Files Storage的配置

例:

cd0411bd6cd421dbec20ab473dfef209.png

第二步,我們需要修改Startup.cs文件的Configure方法。

0c5de2e556eb529fc0ee80a4ded7caec.png

代碼解釋

  • 這里我們使用強類型配置綁定,獲取了appSettings.json中的Azure Files Storage的配置

  • 在配置靜態文件中間件部分,我們通過StaticFileOptions配置對象,指定了當前應用使用AzureFileProvider。

  • 為了演示效果,我這里也啟用了DirectoryBrowser中間件,即可以使用網頁查看目錄結構。這個功能比較危險,在正式項目很少使用。所以正式使用時,最好將這段代碼刪掉。

最終效果

現在我們啟動當前項目, 訪問"/files", 即可查看到當前指定Azure Files Storage中的所有文件和目錄

af520da1ded70651b83bc1229783b54d.png

項目源代碼

https://github.com/lamondlu/AzureFileProvider

Nuget程序集

以上類庫,我已經發布到了Nuget上, 如果你不想每次都把前面的代碼寫一遍,可以直接安裝這個程序集來使用。

Install-Package LamondLu.AzureFileProvider

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530027.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530027.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530027.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql中為表創建副本_如何為數據庫建立一個副本?

展開全部大多情況下,需要可靠而有效地克隆 MySQL 實例e69da5e887aa62616964757a686964616f31333433643663數據。這包括 MySQL 高可用的解決方案,其中需要在將實例加入組復制集群之前配置實例,或者在經典復制模型中將其添加為 Slave。為復制拓…

mysql考勤系統設計函數_Mysql實戰之員工考勤系統數據庫建立

一、項目背景隨著企業的規模不斷擴大,企業人事管理的日趨復雜和企業人員的增多,迫切需要開發基于網絡的員工考勤管理系統來提高管理工作的效率。二、研究目的以中小型企業的考勤管理業務為依托,結合科學管理的理論,設計并開發一個…

linux mysql 修改字符集_linux下mysql修改字符集,遠程連接

安裝時候很簡單,但是安裝了后一般不能用安裝后 首先執行mysql -u root mysql這是就會進入mysql命令窗口,這樣是可以使用的,但是我們要先設置密碼1、先設置密碼UPDATE user SET PasswordPASSWORD(123456) where USERroot;2、重新設置一遍密碼&…

mysql授權遠程訪問命令_mysql 授權遠程連接

解決方案改表法可能是你的帳號不允許從遠程登陸,只能在localhost。這個時候只要在localhost的那臺電腦,登入mysql后,更改 "mysql" 數據庫里的 "user" 表里的 "host" 項,從"localhost"改稱…

MySQL根據員工姓名所在部門_用一條SQL語句顯示所有人員的姓名及所在部門

給定以下兩個表:部門ID部門名稱1部門12部門23部門34部門4人員ID人員姓名部門ID1姓名112姓名213姓名324姓名435姓名55(1)用一條SQL語句顯示所有人員的姓名及所在部門,沒有部門的用“...給定以下兩個表:部門ID 部門名稱1 部門12 部門23 部門34 …

mysql begin operations_MySQL入門(七):More JOIN operations

Sqlzoo習題練習:More JOIN operations下面會涉及到更多連接的概念。數據庫由三個表組成:movie , actor 和 casting以及三個表之間的關系。下面為More JOIN 習題內容:--#1/*List the films where the yr is 1962 [Show id, title]*/SELECT id,…

win10安裝mysql5.7.15_win10上如何安裝mysql5.7.16(解壓縮版)

注:本文涉及的是解壓縮版的安裝安裝教程下載mysql解壓縮下載的文件修改ini文件(在解壓縮后的mysql文件夾中)實際上修改的是my-default.ini文件在文件中添加如下路徑和地址其中的data文件夾是沒有的必須自己創建。# These are commonly set, remove the # and set as…

mysql error log清理_手動刪除mysql日志/var/log/mysql/error.log導致的mysql無法啟動

問題環境ubuntu-mate for raspberrymysql默認配置問題起源最近在搞fail2ban這東西,順便翻了翻各種日志,然后看見mysql的日志有點多就想清理一下,于是直接sudo rm -r /var/log/mysql了一下,結果重啟之后發現mysql就不跑了。。。手動…

mysql開啟權限控制_mysql開啟遠程訪問及相關權限控制

開啟mysql遠程訪問:授予用戶user 密碼 passwd 所有權限 所有主機IP可訪問授權語句:Grant on 表名[(列名)] to 用戶 With grant option或 GRANT ON FROM GRANT ALL PRIVILEGES ON *.* TO user% IDENTIFIED BY passwd WITH GRANT OPTION;ALL PRIVILEGES表示…

mysql awr 上海用戶組_mysql awr v1.0.3修正說明以及發布

本版本計劃修正或者包含如下內容:1、innodb buffer_pool只是分配的vm大小,實際并不一定真正使用這么多,還可能會有內存泄露,故調整從innodb_buffer_pool_stats獲取實際值并顯示,同時獲取mysqld進程實際占用的物理內存&…

mysql如何備份一個表單_Mysql億級數據大表單表備份

上一篇Mysql已有億級數據大表按時間分區,介紹了億級數據大表如何按時間分區,也留下了一個問題:備份億級數據大表要耗時多久。本篇將就如何備份億級數據大表展開討論。注意:我這里所說的備份指的是數據從一張表拷貝到另外一張表&am…

mysql mos login_MySQL 中常用的函數

一、DATE_FORMAT()需求:按照日期月份統計數據,但數據庫存儲的格式是 2020-10-01 10:20:45 ,因此需要格式化日期語法:DATE_FORMAT(date,format)第一個參數:指定的日期,第二個參數:需要獲取的格式…

mysql用戶信息備份還原_mysql遷移之新建用戶、備份還原數據庫

事例? 1 mysql -uzixie -pzixie game < /temp/zixie_back.sqlmysql: [Warning] Using a password on the command line interface can be insecure.? 1 mysql -uzixie -p"zixie"mysql: [Warning] Using a password on the command line interface can be insecu…

centos radius mysql_FreeRadius2 MySQL配置

FreeRadius2可以和MySQL進行集成&#xff0c;集成的內容包括創建符合要求的數據庫和表結構&#xff0c;為MySQL進行的相關配置&#xff0c;基于數據庫安裝Web管理程序(如daloradius,ARA等)&#xff0c;大部分內容可以參見0. 環境FreeRadius2 / MySQL 5 /CentOS 5.5(VirtualBox)…

需求調研的方法及過程_培訓需求調研方法

課程設計與開發是每一位職業培訓師都必須會的技能&#xff0c;今天我們就來分享一下如何開發課程。第一節課&#xff0c;讓我們先從培訓需求調研開始。培訓需求調研方法有很多&#xff0c;從個體層次分為&#xff1a;問卷法、觀察法、訪談法&#xff1b;從組織層次分為&#xf…

java報錯空指針異常_java – 空指針異常錯誤,沒有明顯的代碼錯誤

我在這里有一個錯誤,我不知道它來自哪里.我在初學者的java課程是高中,所以我在這里還沒有太多的經驗.我有3個相互合并的程序.我有一個卡片類,可以創建一張撲克牌//********************************************************************// Card.java Author: Lewis and Loftus…

mysql表的設計幾種方式_支持多種登錄方式的數據表設計 | 六阿哥博客

一個帶有用戶系統的應用最基本登錄方式是站內賬號登錄&#xff0c;但這種方式往往不能滿足我們的需求。現在的應用基本都有站內賬號、email、手機和一堆第三方登錄&#xff0c;那么如果需要支持這么多種登錄方式&#xff0c;或者還有銀行卡登錄、身份證登錄等等更多的登錄方式&…

將Go語言開發的Web程序部署到K8S

搭建K8S基礎環境 如果已經有K8S環境的同學可以跳過&#xff0c;如果沒有&#xff0c;推薦你看看我的《Ubuntu22加Minikue搭建K8S環境》&#xff0c;課程目錄如下&#xff1a; Ubuntu22安裝Vscode 下載&#xff1a;https://code.visualstudio.com/Download 安裝命令&#…

python 掃描儀_基于Opencv和Python的多選掃描儀

首先&#xff0c;我檢測到圖像右側的20個黑框&#xff0c;然后將x和寬度添加到列表中&#xff1a;image cv2.imread(args["image"])gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)(_, thresh) cv2.threshold(gray, 220, 255,cv2.THRESH_BINARY)kernel cv2.getStr…

mysql dmz_MySQL 中LIMIT的使用詳解

MySQL的Limit子句Limit子句可以被用于強制 SELECT 語句返回指定的記錄數。Limit接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數&#xff0c;第一個參數指定第一個返回記錄行的偏移量&#xff0c;第二個參數指定返回記錄行的最大數目。//初始記錄行的偏移量…