ASP.NET Core 2.0中的Azure Blob存储
问题
如何在ASP.NET Core中使用Azure Blob存储
解
创建一个类库并添加NuGet包 - WindowsAzure.Storage
添加一个类来封装设置,
publicclass AzureBlobSetings
{
public AzureBlobSetings(string storageAccount,
string storageKey,
string containerName)
{
if (string.IsNullOrEmpty(storageAccount))
thrownew ArgumentNullException("StorageAccount");
if (string.IsNullOrEmpty(storageKey))
thrownew ArgumentNullException("StorageKey");
if (string.IsNullOrEmpty(containerName))
thrownew ArgumentNullException("ContainerName");
this.StorageAccount = storageAccount;
this.StorageKey = storageKey;
this.ContainerName = containerName;
}
public string StorageAccount { get; }
public string StorageKey { get; }
public string ContainerName { get; }
}
添加一个类来封装一个blob项目,
publicclass AzureBlobItem
{
public AzureBlobItem(IListBlobItem item)
{
this.Item = item;
}
public IListBlobItem Item { get; }
public bool IsBlockBlob => Item.GetType() == typeof(CloudBlockBlob);
public bool IsPageBlob => Item.GetType() == typeof(CloudPageBlob);
public bool IsDirectory => Item.GetType() == typeof(CloudBlobDirectory);
public string BlobName => IsBlockBlob ? ((CloudBlockBlob)Item).Name :
IsPageBlob ? ((CloudPageBlob)Item).Name :
IsDirectory ? ((CloudBlobDirectory)Item).Prefix :
"";
public string Folder => BlobName.Contains("/") ?
BlobName.Substring(0, BlobName.LastIndexOf("/")) : "";
public string Name => BlobName.Contains("/") ?
BlobName.Substring(BlobName.LastIndexOf("/") + 1) : BlobName;
}
Add a class to encapsulate storage access. Add a private helper methods to access storage,
private async Task<CloudBlobContainer> GetContainerAsync()
{
//Account
CloudStorageAccount storageAccount = new CloudStorageAccount(
new StorageCredentials(settings.StorageAccount, settings.StorageKey), false);
//Client
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
//Container
CloudBlobContainer blobContainer =
blobClient.GetContainerReference(settings.ContainerName);
await blobContainer.CreateIfNotExistsAsync();
return blobContainer;
}
private async Task<CloudBlockBlob> GetBlockBlobAsync(string blobName)
{
//Container
CloudBlobContainer blobContainer = await GetContainerAsync();
//Blob
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(blobName);
return blockBlob;
}
private async Task<List<AzureBlobItem>> GetBlobListAsync(
bool useFlatListing = true)
{
//Container
CloudBlobContainer blobContainer = await GetContainerAsync();
//List
var list = new List<AzureBlobItem>();
BlobContinuationToken token = null;
do
{
BlobResultSegment resultSegment =
await blobContainer.ListBlobsSegmentedAsync("", useFlatListing,
new BlobListingDetails(), null, token, null, null);
token = resultSegment.ContinuationToken;
foreach (IListBlobItem item in resultSegment.Results)
{
list.Add(new AzureBlobItem(item));
}
} while (token != null);
return list.OrderBy(i => i.Folder).ThenBy(i => i.Name).ToList();
}
现在添加公共方法来上传和下载blob项目,
public async Task UploadAsync(string blobName, string filePath)
{
//Blob
CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);
//Upload
using (var fileStream = System.IO.File.Open(filePath, FileMode.Open))
{
fileStream.Position = 0;
await blockBlob.UploadFromStreamAsync(fileStream);
}
}
public async Task UploadAsync(string blobName, Stream stream)
{
//Blob
CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);
//Upload
stream.Position = 0;
await blockBlob.UploadFromStreamAsync(stream);
}
public async Task<MemoryStream> DownloadAsync(string blobName)
{
//Blob
CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);
//Download
using (var stream = new MemoryStream())
{
await blockBlob.DownloadToStreamAsync(stream);
return stream;
}
}
public async Task DownloadAsync(string blobName, string path)
{
//Blob
CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);
//Download
await blockBlob.DownloadToFileAsync(path, FileMode.Create);
}
添加方法来获取blob项目列表,
public async Task<List<AzureBlobItem>> ListAsync()
{
return await GetBlobListAsync();
}
public async Task<List<string>> ListFoldersAsync()
{
var list = await GetBlobListAsync();
return list.Where(i => !string.IsNullOrEmpty(i.Folder))
.Select(i => i.Folder)
.Distinct()
.OrderBy(i => i)
.ToList();
}
注入和使用存储助手,
publicclass HomeController : Controller
{
private readonly IAzureBlobStorage blobStorage;
public HomeController(IAzureBlobStorage blobStorage)
{
this.blobStorage = blobStorage;
}
注意
示例代码具有一个控制器,其中包含列出,下载和上载项目的操作。
在 ASP.NET核心 Web应用程序中,配置服务,
publicvoid ConfigureServices(
IServiceCollection services)
{
services.AddScoped<IAzureBlobStorage>(factory =>
{
returnnew AzureBlobStorage(new AzureBlobSetings(
storageAccount: Configuration["Blob_StorageAccount"],
storageKey: Configuration["Blob_StorageKey"],
containerName: Configuration["Blob_ContainerName"]));
});
services.AddMvc();
}
讨论
示例代码将要求您设置Azure帐户,Blob存储帐户和容器。这些指令可以在这里找到
ASP.NET Core 2.0中的Azure Blob存储的更多相关文章
- 在ASP.NET Core 1.0中如何发送邮件
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:目前.NET Core 1.0中并没有提供SMTP相关的类库,那么要如何从ASP.NE ...
- ASP.NET Core 1.0 中的依赖项管理
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
- ASP.NET Core 1.0 中使用 Swagger 生成文档
github:https://github.com/domaindrivendev/Ahoy 之前文章有介绍在ASP.NET WebAPI 中使用Swagger生成文档,ASP.NET Core 1. ...
- 用ASP.NET Core 1.0中实现邮件发送功能
准备将一些项目迁移到 asp.net core 先从封装类库入手,在遇到邮件发送类时发现在 asp.net core 1.0中并示提供SMTP相关类库,于是网上一搜发现了MailKit 好东西一定要试 ...
- 在ASP.NET Core 2.0中使用CookieAuthentication
在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...
- 如何在ASP.NET Core 2.0中使用Razor页面
如何在ASP.NET Core 2.0中使用Razor页面 DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...
- ASP.NET Core 3.0中使用动态控制器路由
原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...
- asp.net core 3.0 中使用 swagger
asp.net core 3.0 中使用 swagger Intro 上次更新了 asp.net core 3.0 简单的记录了一下 swagger 的使用,那个项目的 api 比较简单,都是匿名接口 ...
- 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation
前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...
随机推荐
- 7-n!的位数(斯特灵公式)
http://acm.hdu.edu.cn/showproblem.php?pid=1018 Big NumberTime Limit: 2000/1000 MS (Java/Others) Memo ...
- chrome扩展安装图文教程
众所周知chrome的各类插件,扩展很丰富,也有很多经典的应用.但是谷歌经常被墙,无法访问,想要通过访问谷歌的应用市场来直接安装浏览器扩展会比较让人抓狂,好不容易无数次刷新后打开了页面,找到了想要的应 ...
- Luogu 4449 于神之怒加强版
挺套路的题,然而一开始还是想错了…… $\sum_{i = 1}^{n}\sum_{j = 1}^{m}gcd(i, j) ^ {k} = \sum_{T = 1}^{min(n, m)}\left ...
- [Training Video - 3] [Java Introduction] [Object Oriented Programming]
Static and non-Static : 非静态方法(不带static)可以访问静态变量和方法(带static),但是反过来就不行. 类的静态成员(变量和方法)属于类本身,在类加载的时候就会分 ...
- 06 Python字符编码与文件处理
python垃圾回收机制: python中的垃圾回收机制是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题,一个对象的引用数为0 ,那么这个对象就会被python虚拟机回收内存 字符编码 ...
- Linux命令行下的vim文本编辑器
Linux命令行下的vim文本编辑器 下面这个网站的地址讲解的非成分清楚!!!! http://blog.csdn.net/niushuai666/article/details/7275406 学习 ...
- FIREDAC的TFDJSONDataSets和TFDJSONDeltas查询和提交数据
服务端代码: uses Data.FireDACJSONReflect, FireDAC.Stan.Storage, FireDAC.Stan.StorageBin, FireDAC.Stan.Sto ...
- [毕业设计][期末作业]二手闲置小程序 免费信息发布系统功能源码(小程序+php后台管理)
最近做了一个小程序,主要是二手闲置免费信息发布系统的功能,里面包括了登录,发布商品,商品管理,违规投诉,canva商品海报生成,分享等一些基础的功能,可以说代码都是自己辛辛苦苦写出来的.可作为毕业设计 ...
- SQL Server 数据库的分类和用户数据库文件组成
数据库的分类 数据库分为两大类,一类是系统数据库:另一类是用户数据库,系统数据库我们一般使用的时候较少, 下面我们看看系统数据库包含哪些并分别有什么作用,如下图所示 用户数据库文件组成 ...
- JAVA—IO操作
一.JAVA I/O 输入输出流 1:编码问题 2:File类的使用 3:RandomAccessFile的使用 4:字节流的使用 5:字符流的使用 6:对象的序列化和反序列化 2: file类的使用 ...