Azure Blob Storage 基本用法 -- Azure Storage 之 Blob

简介: Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table。 笔者在《Azure Table storage 基本用法》一文中,介绍了 Table Storage 的基本用法,本文将通过 C# 代码介绍 Blob Storage 的主要使用方法。

Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table。

笔者在《Azure Table storage 基本用法》一文中,介绍了 Table Storage 的基本用法,本文将通过 C# 代码介绍 Blob Storage 的主要使用方法。

文章来源:葡萄城产品技术社区

Blob Storage 是什么?

Azure Blob Storage 是用来存放大量的像文本、图片、视频等非结构化数据的存储服务。我们可以在任何地方通过互联网协议 http 或者 https 访问 Blob Storage。简单说,就是把文件放在云上,给它一个 URL,通过这个 URL 来访问文件。这就涉及到一个问题:如何控制访问权限?答案是我们可以根据自己的需要,设置 Blob 对象是只能被自己访问,还是可以被所有人访问。

下面是 Blog Storage 典型的应用场景:

  1. 存储图片和文档,这些文件可以直接通过浏览器访问。
  2. 支持分布式访问,主要用于 cdn。
  3. 提供视频、音频流。
  4. 存储基本的文件备份和归档文件。

Azure Blob Storage 的结构

下图描述了 Blob Storage 的基本组织结构:

  • Azure Storage Account:

Storage Account 是用来管理 Azure Storage 的一个命名空间,主要用来控制存储数据的访问权限和计费。对于 Blob、Queue、File 和 Table 这些 Azure 提供的存储服务的访问控制,都是通过 Storage Account 来进行的,所以要想使用 Blob Storage,首先需要创建你的 Storage Account。

  • Container:

Container 中包含一组资源,所有的 Blob 都必须存在于Container中。一个 Storage Account 中可以包含无限个 Container,每个Container中也可以包含无限个Blob。需要注意的是 Container 的名字必须全部小写。

  • Blob:

一个Blob 就代表一个文件。为了区分应用的场景及提升不同应用场景下存储的性能,又为 Blob 划分了不同的类型:block blobs, page blobs,append blobs。

  1. Block blobs 主要用来存储静态的文件,比如图片、电影和文档。
  2. Append blobs 与 block blobs 类似,但优化了 append 操作,主要的应用场景是存储日志文件。
  3. Page blobs 针对频繁的读写操作做了优化,如 Azure 上虚拟机的磁盘,就是使用的 page blobs。

如果你还不熟悉 Azure Storage Account 的使用,以及如何通过 WindowsAzure.Storage 库访问 Azure Storage,请参考前文《Azure Table storage 基本用法中的介绍。

为了方便查看 C# 代码执行的结果,本文使用了 MS 发布的一个 Azure Storage 客户端工具:Microsoft Azure Storage Explorer,文中简称为 Storage Explorer。

接下来我们直接通过 C# 代码来介绍如何操作 Blob Storage。

创建 Blob Container

由于任何一个 Blob 都必须包含在一个 Blob Container 中,所以我们第一步先创建一个名为“picturecontainer”的 Blob Container:

//CloudStorageAccount 类表示一个 Azure Storage Account,我们需要先创建它的实例,才能访问属于它的资源。
//注意连接字符串中的xxx和yyy,分别对应Access keys中的Storage account name 和 key。
CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=xxx;AccountKey=yyy");


//CloudBlobClient 类是 Windows Azure Blob Service 客户端的逻辑表示,我们需要使用它来配置和执行对 Blob Storage 的操作。 CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

//CloudBlobContainer 表示一个 Blob Container 对象。 CloudBlobContainer container = blobClient.GetContainerReference("picturecontainer");

//如果不存在就创建名为 picturecontainer 的 Blob Container。 container.CreateIfNotExists();

执行上面的代码,然后打开 Storage Explorer,刷新一下,看到名为“picturecontainer”的 Blob Container 已经创建:

Container 名称规则

MSDN 上不厌其烦的描述 Blob Container 的名称规则,足以说明其重要性,本文试图以简要的文字进行描述:

  1. 以小写字母或数字开头,只能包含字母、数字和 dash(-)。
  2. 不能有连续的 dash(-),dash(-)不能是第一个字符,也不能是最后一个字符。
  3. 所有字符小写,总长度为 3-63 字符。

违反任何一个规则,在创建 Blob Container 时都会受到 (400) Bad Request 错误。

上传 Blob 文件

我们上传一个文件到刚才创建的 Container 中:

//mypicture.png 为放在 container 中的 Blob 的名称。
//GetBlockBlobReference 方法获得一个 Block 类型的 Blob 对象的引用。
//您可以根据应用的需要,分别调用 GetBlobReference,GetAppendBlobReference 或 GetPageBlobReference 来创建不同类型的 Blob 对象。
CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png");
using (var fileStream = System.IO.File.OpenRead(file))
{
    // 这是一个同步执行的方法
    blockBlob.UploadFromStream(fileStream);
}

在代码中我们通过调用刚才创建的 Container 对象 container 的 GetBlockBlobReference 方法,获得了一个 CloudBlockBlob 类型的对象。然后通过它的 UploadFromStream 方法把一个本地的文件上传到了云端。

刷新 Storage Explorer 看看上传的结果:

图片中显示文件已经上传成功!

遍历 Container 中的内容

如果我们想要罗列出一个 Container 中的所有 Blob 对象,就需要对整个 Container 进行遍历操作:

foreach (IListBlobItem item in container.ListBlobs(null, false))
{
    if (item.GetType() == typeof(CloudBlockBlob))
    {
        CloudBlockBlob blob = (CloudBlockBlob)item;
        // todo something
    }
    else if (item.GetType() == typeof(CloudAppendBlob))
    {
        CloudAppendBlob appendBlob = (CloudAppendBlob)item;
        // todo something
    }
    else if (item.GetType() == typeof(CloudPageBlob))
    {
        CloudPageBlob pageBlob = (CloudPageBlob)item;
        // todo something
    }
    else if (item.GetType() == typeof(CloudBlobDirectory))
    {
        CloudBlobDirectory directory = (CloudBlobDirectory)item;
        // todo something
    }
}

这段代码中有两处需要注意的地方:

  1. 获得的 Blob 对象是有类型的。
  2. 可以获得一个虚拟的目录信息,其实是对文件名称的解析。比如一个 Blob 的名称为 abc/flower.jpg,此时就能获得一个名叫 abc 的虚拟目录信息。

下载 Blob 文件

有上传自然要有下载,看看下载一个 Blob 对象的代码:

// 创建名称为 mypicture.png 的 Blob 对象的引用。
CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png");
// 把文件保存到本地。
using (var fileStream = System.IO.File.OpenWrite(fileName))
{
    blockBlob.DownloadToStream(fileStream);
}

Mypicture.png 被下载到本地指定的文件中。

设置 Blob 的访问权限

我们在本文开始的地方就强调可以通过 http 或 https 协议访问 Blob Storage 文件,现在我们就尝试一下。

在 Storage Explorer 中选择 mypicture.png,右键,选择“Copy URL to Clipboard”。把 URL 粘贴到浏览器的地址栏中。

怎么回事?文件不存在吗?不是的,默认情况下,你的文件是被保护的,只有通过你的 Storage Account 验证后才能访问。如果想要把它设置为任何人都能访问,需要通过设置 Container 的权限来实现。

private static void SetPublicContainerPermissions(CloudBlobContainer container)
{
    BlobContainerPermissions permissions = container.GetPermissions();
    // Container 中的所有 Blob 都能被访问
    permissions.PublicAccess = BlobContainerPublicAccessType.Container;
    container.SetPermissions(permissions);
}

重新在浏览器中访问一次试试:

注意,针对上传文件的权限需要谨慎处理,个人文件不建议设置为任何人都能访问。

删除 Blob 文件

mypicture.png 已经完成了演示的使命,通过以下命令就可以删除它了:

CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png");
blockBlob.Delete();

总结

Blob Storage 以其丰富的类型(block,append,page)为各类应用场景提供了最优的选择。本文仅仅是入门的介绍,更多的场景如用 Blob 存储设置 cdn ,如何对数据进行加密存储等内容都没有涉及。希望对刚接触 Azure 的朋友有所帮助。

 

相关阅读:

最全的Windows Azure学习教程汇总

Azure Queue Storage 基本用法 -- Azure Storage 之 Queue

Azure File Storage 基本用法 -- Azure Storage 之 File

Azure Table storage 基本用法 -- Azure Storage 之 Table

 

相关文章
Foo
|
存储 Prometheus 监控
拥抱开源生态:阿里云InfluxDB集成Prometheus查询
前言 Prometheus是CNCF的毕业项目,其生态已成为云原生监控领域的事实标准。Kubernetes集群的指标通过Prometheus格式暴露,很多新项目也直接选择Prometheus格式暴露指标数据,传统应用(比如MySQL, MongoDB,Redis等)在开源社区都有Prometheus Exporter来接入Prometheus生态。 Prometheus内置的tsdb适合存储短
Foo
2608 0
拥抱开源生态:阿里云InfluxDB集成Prometheus查询
|
8月前
|
人工智能 JavaScript 开发工具
MCP详解:背景、架构与应用
模型上下文协议(MCP)是由Anthropic提出的开源标准,旨在解决大语言模型与外部数据源和工具集成的难题。作为AI领域的“USB-C接口”,MCP通过标准化、双向通信通道连接模型与外部服务,支持资源访问、工具调用及提示模板交互。其架构基于客户端-服务器模型,提供Python、TypeScript等多语言SDK,方便开发者快速构建服务。MCP已广泛应用于文件系统、数据库、网页浏览等领域,并被阿里云百炼平台引入,助力快速搭建智能助手。未来,MCP有望成为连接大模型与现实世界的通用标准,推动AI生态繁荣发展。
7308 66
|
JSON 网络协议 Go
golang使用resty库实现模拟请求正方教务
本文主要讲解了如何使用golang模拟请求正方教务
717 0
|
文字识别 小程序 测试技术
网易私有云新增的测试驱动力,Airtest-ocr文字识别点击真香!
网易私有云新增的测试驱动力,Airtest-ocr文字识别点击真香!
818 0
|
Go
golang run时报undefined错误【已解决】
golang run时报undefined错误【已解决】
3889 0
golang run时报undefined错误【已解决】
|
8月前
|
数据采集 人工智能 自然语言处理
模型时代的智能BI—Quick BI:阿里云的数据洞察与决策引擎
阿里云Quick BI是一款企业级智能BI工具,融合大模型技术实现自然语言交互、自动化洞察与预测分析。支持多源数据接入,提供50+图表类型及行业模板,助力敏捷业务分析与AI增强决策。相比Tableau、Power BI等竞品,Quick BI以云原生低成本和通义大模型优势脱颖而出,适用于零售、金融等领域,推动数据民主化与智能化转型。推荐已使用阿里云生态的企业采用,分阶段推广功能以最大化价值。
1226 2
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
457 11
|
监控 异构计算
Jetson 学习笔记(八):htop查看CPU占用情况和jtop监控CPU和GPU
在NVIDIA Jetson平台上使用htop和jtop工具来监控CPU、GPU和内存的使用情况,并提供了安装和使用这些工具的具体命令。
1126 0
|
算法 Java 测试技术
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
java 访问ingress https报错javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
2027 1
|
机器学习/深度学习 人工智能 算法
AI代码生成器——Tabnine
【2月更文挑战第17天】AI代码生成器——Tabnine
602 9
AI代码生成器——Tabnine