在NETCORE中,实现对AzureBLOB文件的上传下载操作

在之前的文章中,说到了SeaweedFS和MinIO,如果是使用的微软全家桶的话,那肯定就使用Azure Blob了,更直接、更简单和更高效。

一、什么是Azure Blob?

  Azure Blob 存储是 Microsoft 提供的适用于云的对象存储解决方案。它可以保存的数据类型是没有任何限制的。如,pdf文档,json文件,视频,txt文件等。它具有比内存和本地磁盘更高的延迟,并且没有可让数据库高效运行查询的索引功能。但是,blob经常和数据库一起用来存储不可查询的的数据,例如图片文件存储在Blob中,数据库中保存对应用户头像的Blob名称或URL。

说白了,其实Azure Blob就是一个文件服务器。.

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

Blob 存储可以用于直接向浏览器提供图像或文档。存储文件以供分布式访问。对视频和音频进行流式处理。向日志文件进行写入。存储用于备份和还原、灾难恢复及存档的数据。存储数据以供本地或 Azure 托管服务执行分析。提供了不同语言的客户端库,包括:NET、Java、Node.js、Python、Go、PHP、Ruby,涵盖了绝大多数的互联网开发框架和语言。

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

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

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

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

今天我们演示的是 block blob类型的,接下来我们看看在实际项目中,我们是如何进行操作的。

二、在Azure Portal上创建Blob数据

若要访问 Azure 存储,需要一个 Azure 订阅。如果还没有订阅,请在开始前创建一个免费账户。找到之前创建好的  Storage Account,点击图中圈起来的 “Containers”,进行创建容器 。

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

在NETCORE中,实现对AzureBLOB文件的上传下载操作

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

Name:“testcontainer”

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

点击 “Create"

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

可以直接上传BLOB块

在NETCORE中,实现对AzureBLOB文件的上传下载操作

也可以在线下载

在NETCORE中,实现对AzureBLOB文件的上传下载操作

三、在ASP.NETCore中使用Azure Blob

1、配置并读取配置参数

 "AzureADAppSetup": {    "blobAccountName": "xxxxx",    "blobFileDownloadConnectionString": "DefaultEndpointsProtocol=https;AccountName=xxxxx;AccountKey={0};EndpointSuffix=xxx.chinacloudapi.cn"  },

2、添加nuget依赖包

<PackageReference Include="Azure.Storage.Blobs" Version="12.9.1" /><PackageReference Include="WindowsAzure.Storage" Version="9.3.3" />

3、实现上传与下载

上传

 CloudStorageAccount storageAccount = CloudStorageAccount.Parse(AzureADAppSetup.blobFileDownloadConnectionString); CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); CloudBlobContainer container = blobClient.GetContainerReference("xxxx");
 var fileName = file.FileName.Substring(0, file.FileName.LastIndexOf(".")); var fileExtensionName = file.FileName.Substring(file.FileName.LastIndexOf(".") + 1); var timeStampName = DateTime.Now.AddHours(8).ToString("yyyyMMdd-HHmmss"); var uploadBlobFileName = $"{fileName}-{timeStampName}.{fileExtensionName}"; CloudBlockBlob blob = container.GetBlockBlobReference(uploadBlobFileName);
 if (blob.ExistsAsync().Result) {     return ApiResultVo<FileStreamResult>.error("同名文件已存在."); }
 blob.UploadFromStreamAsync(file.OpenReadStream()).Wait();

下载

  CloudStorageAccount storageAccount = CloudStorageAccount.Parse(AzureADAppSetup.blobFileDownloadConnectionString);  CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();  CloudBlobContainer container = blobClient.GetContainerReference(containerName);
  string newDirPath = url.Substring($"{urlData[0]}/{urlData[1]}/".Length);  CloudBlockBlob blob = container.GetBlockBlobReference(newDirPath);

  //var dataText = blob.DownloadTextAsync().GetAwaiter().GetResult();  using (FileStream fs = new(@$"file-cache/{newDirPath}", FileMode.Create, FileAccess.Write))//暂存到临时文件中  {      blob.DownloadToStreamAsync(fs).Wait();  }
  var stream = System.IO.File.OpenRead($"file-cache/{newDirPath}");
  return File(stream, "application/octet-stream", fileName);

在上边的代码里,获取blog字符串的时候,用到了{0}占位符来控制我们的私钥,那接下来咱们就说说Azure K8s中经常用到了KeyVault技术。