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。为复制拓…

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;第二个参数指定返回记录行的最大数目。//初始记录行的偏移量…