前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在NETCORE中,实现对AzureBLOB文件的上传下载操作

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

作者头像
老张的哲学
发布2023-08-23 13:56:03
4610
发布2023-08-23 13:56:03
举报
文章被收录于专栏:NetCore 从壹开始

在之前的文章中,说到了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 ”,进行创建容器

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

Name:“testcontainer”

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

点击 “Create"

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

可以直接上传BLOB块

也可以在线下载

三、在ASP.NETCore中使用Azure Blob

1、配置并读取配置参数

代码语言:javascript
复制
 "AzureADAppSetup": {
    "blobAccountName": "xxxxx",
    "blobFileDownloadConnectionString": "DefaultEndpointsProtocol=https;AccountName=xxxxx;AccountKey={0};EndpointSuffix=xxx.chinacloudapi.cn"
  },

2、添加nuget依赖包

代码语言:javascript
复制
<PackageReference Include="Azure.Storage.Blobs" Version="12.9.1" />
<PackageReference Include="WindowsAzure.Storage" Version="9.3.3" />

3、实现上传与下载

上传

代码语言:javascript
复制
 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();

下载

代码语言:javascript
复制
  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技术。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 NetCore 从壹开始 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档