在之前的文章中,说到了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、配置并读取配置参数
"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技术。
本文分享自 NetCore 从壹开始 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!