问题

如何在ASP.NET Core中使用Azure Blob存储

创建一个类库并添加NuGet包 - WindowsAzure.Storage

添加一个类来封装设置,

  1. publicclass AzureBlobSetings

  2. {

  3. public AzureBlobSetings(string storageAccount,

  4. string storageKey,

  5. string containerName)

  6. {

  7. if (string.IsNullOrEmpty(storageAccount))

  8. thrownew ArgumentNullException("StorageAccount");

  9. if (string.IsNullOrEmpty(storageKey))

  10. thrownew ArgumentNullException("StorageKey");

  11. if (string.IsNullOrEmpty(containerName))

  12. thrownew ArgumentNullException("ContainerName");

  13. this.StorageAccount = storageAccount;

  14. this.StorageKey = storageKey;

  15. this.ContainerName = containerName;

  16. }

  17. public string StorageAccount { get; }

  18. public string StorageKey { get; }

  19. public string ContainerName { get; }

  20. }

添加一个类来封装一个blob项目,

  1. publicclass AzureBlobItem

  2. {

  3. public AzureBlobItem(IListBlobItem item)

  4. {

  5. this.Item = item;

  6. }

  7. public IListBlobItem Item { get; }

  8. public bool IsBlockBlob => Item.GetType() == typeof(CloudBlockBlob);

  9. public bool IsPageBlob => Item.GetType() == typeof(CloudPageBlob);

  10. public bool IsDirectory => Item.GetType() == typeof(CloudBlobDirectory);

  11. public string BlobName => IsBlockBlob ? ((CloudBlockBlob)Item).Name :

  12. IsPageBlob ? ((CloudPageBlob)Item).Name :

  13. IsDirectory ? ((CloudBlobDirectory)Item).Prefix :

  14. "";

  15. public string Folder => BlobName.Contains("/") ?

  16. BlobName.Substring(0, BlobName.LastIndexOf("/")) : "";

  17. public string Name => BlobName.Contains("/") ?

  18. BlobName.Substring(BlobName.LastIndexOf("/") + 1) : BlobName;

  19. }

Add a class to encapsulate storage access. Add a private helper methods to access storage,

  1. private async Task<CloudBlobContainer> GetContainerAsync()

  2. {

  3. //Account

  4. CloudStorageAccount storageAccount = new CloudStorageAccount(

  5. new StorageCredentials(settings.StorageAccount, settings.StorageKey), false);

  6. //Client

  7. CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

  8. //Container

  9. CloudBlobContainer blobContainer =

  10. blobClient.GetContainerReference(settings.ContainerName);

  11. await blobContainer.CreateIfNotExistsAsync();

  12. return blobContainer;

  13. }

  14. private async Task<CloudBlockBlob> GetBlockBlobAsync(string blobName)

  15. {

  16. //Container

  17. CloudBlobContainer blobContainer = await GetContainerAsync();

  18. //Blob

  19. CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(blobName);

  20. return blockBlob;

  21. }

  22. private async Task<List<AzureBlobItem>> GetBlobListAsync(

  23. bool useFlatListing = true)

  24. {

  25. //Container

  26. CloudBlobContainer blobContainer = await GetContainerAsync();

  27. //List

  28. var list = new List<AzureBlobItem>();

  29. BlobContinuationToken token = null;

  30. do

  31. {

  32. BlobResultSegment resultSegment =

  33. await blobContainer.ListBlobsSegmentedAsync("", useFlatListing,

  34. new BlobListingDetails(), null, token, null, null);

  35. token = resultSegment.ContinuationToken;

  36. foreach (IListBlobItem item in resultSegment.Results)

  37. {

  38. list.Add(new AzureBlobItem(item));

  39. }

  40. } while (token != null);

  41. return list.OrderBy(i => i.Folder).ThenBy(i => i.Name).ToList();

  42. }

现在添加公共方法来上传和下载blob项目,

  1. public async Task UploadAsync(string blobName, string filePath)

  2. {

  3. //Blob

  4. CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);

  5. //Upload

  6. using (var fileStream = System.IO.File.Open(filePath, FileMode.Open))

  7. {

  8. fileStream.Position = 0;

  9. await blockBlob.UploadFromStreamAsync(fileStream);

  10. }

  11. }

  12. public async Task UploadAsync(string blobName, Stream stream)

  13. {

  14. //Blob

  15. CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);

  16. //Upload

  17. stream.Position = 0;

  18. await blockBlob.UploadFromStreamAsync(stream);

  19. }

  20. public async Task<MemoryStream> DownloadAsync(string blobName)

  21. {

  22. //Blob

  23. CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);

  24. //Download

  25. using (var stream = new MemoryStream())

  26. {

  27. await blockBlob.DownloadToStreamAsync(stream);

  28. return stream;

  29. }

  30. }

  31. public async Task DownloadAsync(string blobName, string path)

  32. {

  33. //Blob

  34. CloudBlockBlob blockBlob = await GetBlockBlobAsync(blobName);

  35. //Download

  36. await blockBlob.DownloadToFileAsync(path, FileMode.Create);

  37. }

添加方法来获取blob项目列表,

  1. public async Task<List<AzureBlobItem>> ListAsync()

  2. {

  3. return await GetBlobListAsync();

  4. }

  5. public async Task<List<string>> ListFoldersAsync()

  6. {

  7. var list = await GetBlobListAsync();

  8. return list.Where(i => !string.IsNullOrEmpty(i.Folder))

  9. .Select(i => i.Folder)

  10. .Distinct()

  11. .OrderBy(i => i)

  12. .ToList();

  13. }

注入和使用存储助手,

  1. publicclass HomeController : Controller

  2. {

  3. private readonly IAzureBlobStorage blobStorage;

  4. public HomeController(IAzureBlobStorage blobStorage)

  5. {

  6. this.blobStorage = blobStorage;

  7. }

注意

示例代码具有一个控制器,其中包含列出,下载和上载项目的操作。

在 ASP.NET核心 Web应用程序中,配置服务,

  1. publicvoid ConfigureServices(

  2. IServiceCollection services)

  3. {

  4. services.AddScoped<IAzureBlobStorage>(factory =>

  5. {

  6. returnnew AzureBlobStorage(new AzureBlobSetings(

  7. storageAccount: Configuration["Blob_StorageAccount"],

  8. storageKey: Configuration["Blob_StorageKey"],

  9. containerName: Configuration["Blob_ContainerName"]));

  10. });

  11. services.AddMvc();

  12. }

讨论

示例代码将要求您设置Azure帐户,Blob存储帐户和容器。这些指令可以在这里找到

ASP.NET Core 2.0中的Azure Blob存储的更多相关文章

  1. 在ASP.NET Core 1.0中如何发送邮件

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:目前.NET Core 1.0中并没有提供SMTP相关的类库,那么要如何从ASP.NE ...

  2. ASP.NET Core 1.0 中的依赖项管理

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  3. ASP.NET Core 1.0 中使用 Swagger 生成文档

    github:https://github.com/domaindrivendev/Ahoy 之前文章有介绍在ASP.NET WebAPI 中使用Swagger生成文档,ASP.NET Core 1. ...

  4. 用ASP.NET Core 1.0中实现邮件发送功能

    准备将一些项目迁移到 asp.net core 先从封装类库入手,在遇到邮件发送类时发现在 asp.net core 1.0中并示提供SMTP相关类库,于是网上一搜发现了MailKit 好东西一定要试 ...

  5. 在ASP.NET Core 2.0中使用CookieAuthentication

    在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...

  6. 如何在ASP.NET Core 2.0中使用Razor页面

    如何在ASP.NET Core 2.0中使用Razor页面  DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...

  7. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

  8. asp.net core 3.0 中使用 swagger

    asp.net core 3.0 中使用 swagger Intro 上次更新了 asp.net core 3.0 简单的记录了一下 swagger 的使用,那个项目的 api 比较简单,都是匿名接口 ...

  9. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

随机推荐

  1. php通过反射执行某方法

    简单记录下通过反射来获取某方法的参数,然后利用php内置函数类执行此方法 一个简单的test类 class test { //2个参数默认值 public function b($name='lemo ...

  2. Introduction Sockets to Programming in C using TCP/IP

    Introduction Computer Network: hosts, routers, communication channels Hosts run applications Routers ...

  3. string 转换为枚举对应的值

    public static Object Parse(Type enumType,string value) 例如:(Colors)Enum.Parse(typeof(Colors), "R ...

  4. [label][JavaScript] 自动填充内容的JavaScript 库

    一个帮助你针对不同标签自动填入内容的轻量级javascript类库 - fixiejs http://www.gbtags.com/technology/javascript/20120802-fix ...

  5. 软件项目第一个Sprint评分

    第一组 跑男 跑男组他们设计的是极速蜗牛小游戏,他们的界面背景图片做的挺漂亮,现在为止也实现了大部分功能, 但是我没有太听懂他们的游戏规则. 因为蜗牛出发后,每次碰到屏幕边缘后都会有确定的反弹结果,也 ...

  6. [leetcode] 13. Remove Duplicates from Sorted List

    这个题目其实不难的,主要是我C++的水平太差了,链表那里绊了好久,但是又不像用python,所以还是强行上了. 题目如下: Given a sorted linked list, delete all ...

  7. Sharepoint安装的几处注意事项

    0.sharepoint自带组件安装,无需另下载安装 1.必须安装域(不安装会提示sharepoint 指定的用户是本地账户) 2.域安装后需要在sharepoint设置的数据库账号具有域权限及高级权 ...

  8. Java异常:选择Checked Exception还是Unchecked Exception?

    http://blog.csdn.net/kingzone_2008/article/details/8535287 Java包含两种异常:checked异常和unchecked异常.C#只有unch ...

  9. rpm包的安装,查询,卸载,升级,校验,数据库重建,验证数据包

    rpm命名: 包:组成部分 主包:bind-9.7.1-1.i586.e15.rpm 子包:bind-lib-9.7.1-1.i586.e15.rpm bind-utils-9.7.1-1.i586. ...

  10. c# 线程的基本使用

    创建线程 线程的基本操作 线程和其它常见的类一样,有着很多属性和方法,参考下表: 创建线程的方法有很多种,这里我们先从thread开始创建线程 class Program { static void ...