一,引言

  上一篇文章,我们介绍到在实际项目中系统会产生大量的日志文件,用户上传的头像等等,同时也介绍到可以使用Azure Blob Storage 来存储项目中的一些日志文件,用户头像,用户视频等等。这个时候,有人就会问到,那我大概明白Blob可以存放什么类型的数据了,这个时候就有人问一些问题了

  1,什么是Blob?

  答 Azure Blob 存储是非结构化的,它可以保存的数据类型是没有任何限制的。如,pdf文档,json文件,视频,txt文件等。我们常见的类型的文件,它统统可以进行存储。但是 Blob 不适合需要经常查询的结构化数据, 比如说项目中使用的,它们具有比内存和本地磁盘更高的延迟,并且没有可让数据库高效运行查询的索引功能。但是,blob经常用与数据库一起用于存储不可查询的的数据,例如用户头像存储在Blob中,数据库中保存对应用户头像的Blob名称或URL(来自微软官方解释

  其实用可以这么说,如果项目中有对于的图片资源,视频资源,文件等资源,我们就可以考虑到将这些数据都存储在Azure Blob中。今天在文章的后半段我们将通过一个简单的 .NET Core Web 程序去操作 Blob 存储对象。 

--------------------我是分割线--------------------

Azure Blob Storage 存储系列:

1,Azure Storage 系列(一)入门简介

2,Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

3,Azure Storage 系列(三)Blob 参数设置说明

4,Azure Storage 系列(四)在.Net 上使用Table Storage

5,Azure Storage 系列(五)通过Azure.Cosmos.Table 类库在.Net 上使用 Table Storage  

6,Azure Storage 系列(六)使用Azure Queue Storage

二,正文

开始之前我们看看 Blob 的类型

  1,block blob(块 blob):由不同大小的块构成,在写入到块 blob 时,需要将数据上传到块并将其提交到 blob。

  2,append blob(追加 blob):是专用的块 blob,它仅支持追加新数据,追加操作非常高效。 追加 blob 非常适用于存储日志或写入流数据等方案。

  3,page blob(页 blob):专用于涉及随机存取读写的方案。 页 blob 用于存储 Azure 虚拟机所使用的虚拟硬盘 (VHD) 文件,但它们非常适用于任何涉及到随机存取的方案。

 今天我们演示的是 block blob类似,实际项目中,我们是如何进行操作的

1,Azure Portal 上进行创建 blob 数据

找到之前创建好的 “cnbateblogaccount” Storage Account,点击图中圈起来的 “Containers”,进行创建容器

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

点击 “ + Container ”,进行创建容器

注意:这里的容器,我们可以理解为用来存储对象的容器

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

Name:“picturecontainer”

Public access level 选择:“Private(no anonymous access)”(私有的,不允许匿名访问)

点击 “Create"

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

创建完成后,我们就可以在当前容器页面看到自己创建的 ”picturecontainer“ 信息。

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

我们点击容器进入,尝试在上传一张图片进行测试

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

点击 “Select a file” 进行选择

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

选择 “background.jpg”,点击 "打开"

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

勾选 “Overwrite if file already exist”(如果文件存储,就覆盖)

点击 “Upload” 进行上传

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

我们可以看到上传的图片文件,并且它的 Blob 类型是 “block blob”

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

同时,我们可以还有在Portal 上进行预览,编辑操作。

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

ok,上述操作我们是在Azure Portal 上进行操作的。接下来我们通过代码进行 blob 的增删查

2,通过ASP.NET Core Web 项目进行Blob数据操作

vs2019 新建 Web 项目

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

2.1,首先得安装 Azure.Storage相关的包

NuGet:Azure.Storage.Blobs

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

我们创建  BlobExplorerController 控制器

[HttpGet("{BlobName}")]
public async Task<IActionResult> GetBlob(string blobName)
{
     var data = await _blobService.GetBlobAsync(blobName);
     return File(data.Content, data.ContentType);
}

2.2,创建 IBlobService 接口,和 BlobService 实现类,新增获取 Blob 的接口定义和具体实现方法

Task<BlobInfo> GetBlobAsync(string name);
#region 01,获取Blob,根据blob名称+async Task<BlobInfo> GetBlobAsync(string name)
/// <summary>
/// 获取Blob,根据blob名称
/// </summary>
/// <param name="name">blob名称</param>
/// <returns></returns>
public async Task<Azure.Storage.Models.BlobInfo> GetBlobAsync(string name)
{
   var containerClient = _blobServiceClient.GetBlobContainerClient("picturecontainer");

   var blobClient = containerClient.GetBlobClient(name);
   var blobDownLoadInfo = await blobClient.DownloadAsync();
   return new Azure.Storage.Models.BlobInfo(blobDownLoadInfo.Value.Content, blobDownLoadInfo.Value.ContentType);
 }
 #endregion

创建 BlobInfo 返回实体信息

public class BlobInfo
    {
        public BlobInfo(Stream content, string contentType)
        {
            this.Content = content;
            this.ContentType = contentType;
        }
        public Stream Content { get; set; }

        public string ContentType { get; set; }
    }

2.3 配置链接字符串

Azure Portal 中找到创建的 “cnbateaccount” 的Azure Blob Atorage,点击 “ Setting=> Access key”

复制图中的 “Connection string” 

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

将数据库链接字符串配置在项目的 appsettings 配置文件中

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "AzureBlobStorageConnectionString": "DefaultEndpointsProtocol=https;AccountName=cnbateblogaccount;AccountKey=FU01h022mn1JjONp+ta0DAXOO7ThK3dxxxxxxxxxxxxxxxxx891n9nycsTLGZF83nJpGvTIZvO5VCVxxxxxx0wndOOQ==;EndpointSuffix=core.windows.net"
}

2.4,注入 BlobService,BlobServiceClient

services.AddSingleton(x => new BlobServiceClient(Configuration.GetValue<string("AzureBlobStorageConnectionString")));

services.AddSingleton<IBlobSergvice, BlobService>();

Ok,我们启动项目进行测试

postman 中输入 :localhost:9001/Blobs/background.jpg,效果如下图所示:

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

浏览器访问:http://localhost:9001/Blobs/background.jpg,效果如下图所示: 

Azure Storage 系列(二) .NET Core Web 项目中操作 Blob 存储

ok,成功,成功获取到之前在 Portal 上传的图片

2.5 ,完善对 Blob 数据的新增,删除操作

BlobExplorerController 完整代码

 1 [Route("Blobs")]
 2     public class BlobExplorerController : Controller
 3     {
 4         private readonly IBlobSergvice _blobService;
 5 
 6         public BlobExplorerController(IBlobSergvice blobService)
 7         {
 8             this._blobService = blobService;
 9         }
10 
11         [HttpGet("{BlobName}")]
12         public async Task<IActionResult> GetBlob(string blobName)
13         {
14             var data = await _blobService.GetBlobAsync(blobName);
15             return File(data.Content, data.ContentType);
16         }
17 
18         [HttpGet("BlobsName")]
19         public async Task<IActionResult> ListBlobsName()
20         {
21             return Ok(await _blobService.ListBlobsNameAsync());
22         }
23 
24         [HttpPost("UploadFile")]
25         public async Task<IActionResult> UpLoadFile([FromBody] UploadFileRequest request)
26         {
27             await _blobService.UploadFileBlobAsync(request.FilePath, request.FileName);
28             return Ok();
29         }
30 
31         [HttpPost("UploadContent")]
32         public async Task<IActionResult> UploadContent([FromBody] UpLoadContentRequest request)
33         {
34             await _blobService.UploadContentBlobAsync(request.Content, request.FileName);
35             return Ok();
36         }
37 
38         [HttpDelete("{BlobName}")]
39         public async Task<IActionResult> DaleteFile(string blobName)
40         {
41             await _blobService.DeleteBlobAsync(blobName);
42             return Ok();
43         }
44     }
BlobExplorerController

相关文章:

  • 2021-07-31
  • 2021-12-17
  • 2021-05-03
  • 2021-04-28
  • 2021-12-09
  • 2021-11-04
  • 2021-09-23
猜你喜欢
  • 2021-07-03
  • 2021-12-20
  • 2022-12-23
  • 2022-12-23
  • 2021-11-08
相关资源
相似解决方案