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.mzph.cn/news/530027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql中为表创建副本_如何为数据库建立一个副本?

展开全部大多情况下,需要可靠而有效地克隆 MySQL 实例e69da5e887aa62616964757a686964616f31333433643663数据。这包括 MySQL 高可用的解决方案,其中需要在将实例加入组复制集群之前配置实例,或者在经典复制模型中将其添加为 Slave。为复制拓…

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如何备份一个表单_Mysql亿级数据大表单表备份

上一篇Mysql已有亿级数据大表按时间分区,介绍了亿级数据大表如何按时间分区,也留下了一个问题:备份亿级数据大表要耗时多久。本篇将就如何备份亿级数据大表展开讨论。注意:我这里所说的备份指的是数据从一张表拷贝到另外一张表&am…

mysql mos login_MySQL 中常用的函数

一、DATE_FORMAT()需求:按照日期月份统计数据,但数据库存储的格式是 2020-10-01 10:20:45 ,因此需要格式化日期语法:DATE_FORMAT(date,format)第一个参数:指定的日期,第二个参数:需要获取的格式…

需求调研的方法及过程_培训需求调研方法

课程设计与开发是每一位职业培训师都必须会的技能,今天我们就来分享一下如何开发课程。第一节课,让我们先从培训需求调研开始。培训需求调研方法有很多,从个体层次分为:问卷法、观察法、访谈法;从组织层次分为&#xf…

将Go语言开发的Web程序部署到K8S

搭建K8S基础环境 如果已经有K8S环境的同学可以跳过,如果没有,推荐你看看我的《Ubuntu22加Minikue搭建K8S环境》,课程目录如下: Ubuntu22安装Vscode 下载:https://code.visualstudio.com/Download 安装命令&#…

mysql分表 动态扩容_数据库hash分表后的扩容方案

postgres的hash分表不停机扩容方案原来我们hash分表之后,数据扩容采用的是rehash,这样迁移全部的数据,比较麻烦。本次扩容利用hash环原理,并在此基础上做一些适应性的改动。首先假定哈希环的范围为0-1023,总共1024的数…

php mysql长连接聊天室_PHP之探索MySQL 长连接、连接池

PHP连接MysqL的方式,用的多的是MysqL扩展、MysqLi扩展、pdo_MysqL扩展,是官方提供的。PHP的运行机制是页面执行完会释放所有该PHP进程中的所有资源的,如果有多个并发访问本地的测试页面 http://127.0.0.1/1.php 根据PHP跟web服务器的不同,会开…

python 读取地震道头数据_python地震数据可视化详解

本文实例为大家分享了python地震数据可视化的具体代码,供大家参考,具体内容如下准备工作:在windows10下安装python3.7,下载参考源码到本地。1. demo绘图测试demo绘图指令cmd> python seisplot.py --demo问题1)缺少依赖包File &…

java程序员 css_Java程序员从笨鸟到菜鸟之(十七)CSS基础积累总结(下)

七.组织元素(span和div)span和div元素用于组织和结构化文档,并经常联合class和id属性一起使用。在这一课中,我们将进一步探究span和div的用法,因为这两个HTML元素对于CSS是很重要的。用span组织元素用div组织元素用span组织元素span元素可以说…

java set泛型_Java 集合二 泛型、Set相关

泛型1、在定义一个类的方法时,因为不确定返回值类型,所以用一个符号代替,这个符号就是泛型eg:ArrayList list new ArrayList();2、泛型的好处:1、提高了数据的安全性,将运行时的问题提前暴露在编译阶段2、避免了强转的…

java gson_Java 中 Gson的使用

JSON 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便;解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等一、Gson的基本用法Gson提供了fromJson() 和toJson…

java web 集成dom4j_[JavaWeb基础] 031.dom4j写入xml的方法

上一篇我们讲述了dom4j读取xml的4种方法,甚是精彩,那么怎么样写入xml呢?我们直接看下源码实现。public static void main(String[] args) throws Exception {// 创建文档Document document DocumentHelper.createDocument();// 设置编码docu…

java servlet 调试日志 logger sae_java servlet 调试日志 lo

java servlet 调试日志 lo[2021-02-10 08:32:08] 简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐&#x…

求java简单计算器源代码_java简单计算器源代码

简单计算器代码package calcultorthree;import java.awt.BorderLayout;//导入边界布局管理器类import java.awt.GridLayout;//导入网格布局管理器类import java.awt.TextField;//导入文本区域类import java.awt.event.ActionEvent;//导入事件类import java.awt.event.ActionLis…

java遍历斐波纳契数列_详解循环、迭代、递归、分治(Leet Code 509 斐波那契数列),实际运用...

Multiple solutions of Fibonacci (Python or Java)本章是用英文写的,作为或想成为一名优秀的攻城狮,习惯阅读英文文档将使你受益良多。例如更好的查看最新版的官方文档、与国外友人交流、等等 其实英文的生词也并不多,其中90%的英文都在代码…

java 二分查找 排序_java 冒泡排序 二分查找

下面这个程序是先定义一个整型数组,然后将其中的元素反序赋值,再用冒泡排序进行排序以后用二分查找来查找其中是否有某个数,返回值为-1时表示这个数可能小于这个数组的最小值或大小这个数组的最大值,-2表示这个数比这个数组的最小…

php里h和h的区别吗,编码h264h和h264b有什么区别

区别如下:1、版本H.265是新的编码协议,也即是H.264的升级版。H.265标准保留H.264原来的某些技术,同时对一些相关的技术加以改进。新技术使用先进的技术用以改善码流、编码质量、延时和算法复杂度之间的关系,达到最优化设置。2、储…

php 抽象类 静态方法吗,php中的抽象类和静态方法是什么

php中的抽象类是指:在class前加了abstract关键字且存在抽象方法的类,它不能被直接实例化;静态方法是指:被static关键字修饰的方法,静态方法用于操作静态属性。抽象类抽象类是指在 class 前加了 abstract 关键字且存在抽…

centos 怎样下载php,centos下怎样安装软件

centos下安装软件的方法是:centos安装软件的命令1、rpm包的安装1.安装一个包# rpm -ivh2.升级一个包# rpm -Uvh3.移走一个包# rpm -e4.安装参数--force 即使覆盖属于其它包的文件也强迫安装--nodeps 如果该RPM包的安装依赖其它包,即使其它包没装&#xf…