Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
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 典型的应用场景:
- 存储图片和文档,这些文件可以直接通过浏览器访问。
- 支持分布式访问,主要用于 cdn。
- 提供视频、音频流。
- 存储基本的文件备份和归档文件。
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。
- Block blobs 主要用来存储静态的文件,比如图片、电影和文档。
- Append blobs 与 block blobs 类似,但优化了 append 操作,主要的应用场景是存储日志文件。
- 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 的名称规则,足以说明其重要性,本文试图以简要的文字进行描述:
- 以小写字母或数字开头,只能包含字母、数字和 dash(-)。
- 不能有连续的 dash(-),dash(-)不能是第一个字符,也不能是最后一个字符。
- 所有字符小写,总长度为 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
}
}
这段代码中有两处需要注意的地方:
- 获得的 Blob 对象是有类型的。
- 可以获得一个虚拟的目录信息,其实是对文件名称的解析。比如一个 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 的朋友有所帮助。
相关阅读:
Azure Queue Storage 基本用法 -- Azure Storage 之 Queue
Azure File Storage 基本用法 -- Azure Storage 之 File
Azure Table storage 基本用法 -- Azure Storage 之 Table
Azure Blob Storage 基本用法 -- Azure Storage 之 Blob的更多相关文章
- Azure Queue Storage 基本用法 -- Azure Storage 之 Queue
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure File Storage 基 ...
- Azure File Storage 基本用法 -- Azure Storage 之 File
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Blob Storage 基 ...
- Azure Table storage 基本用法 -- Azure Storage 之 Table
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table,其中的 Table 就是本文的主角 Azure Tabl ...
- [New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传
<Windows Azure Platform 系列文章目录> 相关内容 Windows Azure Platform (二十二) Windows Azure Storage Servic ...
- Windows Azure Storage (24) 启用Azure Blob日志
<Windows Azure Platform 系列文章目录> 之前有一个业务需求,客户想知道Azure Storage是否有日志功能,可以检查某个Azure Blob文件在某个时间点被删 ...
- [AWS vs Azure] 云计算里AWS和Azure的探究(6) - Amazon Simple Storage Service 和 Microsoft Azure Blob Storage
这几天Nasuni公司出了一份报告,分析了各个云厂商的云存储的性能,包括Amazon S3,Azure Blob Storage, Google Drive, HP以及Rackspace.其中性能上A ...
- 【Azure 存储服务】Java Azure Storage SDK V12使用Endpoint连接Blob Service遇见 The Azure Storage endpoint url is malformed
问题描述 使用Azure Storage Account的共享访问签名(Share Access Signature) 生成的终结点,连接时遇见 The Azure Storage endpoint ...
- Windows Azure Storage (20) 使用Azure File实现共享文件夹
<Windows Azure Platform 系列文章目录> Update 2016-4-14.在Azure VM配置FTP和IIS,请参考: http://blogs.iis.net/ ...
- [Windows Azure] How to use the Queue Storage Service
How to use the Queue Storage Service version 1.7 version 2.0 This guide will show you how to perform ...
随机推荐
- 主机ping不同虚拟机
前提:今天加班时,一不小时把网线踢掉了,然而虚拟机怎么都ping不通了,试过很多办法; 最后.... 简单粗暴的重启了我的主机,对,是主机,不是虚拟机,ok,问题解决; over...
- 进击的Python【第五章】:Python的高级应用(二)常用模块
Python的高级应用(二)常用模块学习 本章学习要点: Python模块的定义 time &datetime模块 random模块 os模块 sys模块 shutil模块 ConfigPar ...
- DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)
题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...
- unity 协程
StartCoroutine在unity3d的帮助中叫做协程,意思就是启动一个辅助的线程. 在C#中直接有Thread这个线程,但是在unity中有些元素是不能操作的.这个时候可以使用协程来完成. 使 ...
- POJ 1979 题解
Red and Black Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 31722 Accepted: 17298 D ...
- LINUX常见问题
FQA1:如何进入linux单用户模式修改root密码 进入单用户模式:1. grub进入启动画面之后,敲入“e”,把光标移动到kernel ...那一行,再敲入“e”,在kernel 一行的最后加上 ...
- postman 断言解析
最近在学习postman官方文档, 顺势翻译出来,以供学习! postman断言是JavaScript语言编写的,在postman客户端指定区域编写即可. 断言会在请求返回之后,运行,并根据断言的pa ...
- Windows中断那些事儿
搞内核研究的经常对中断这个概念肯定不陌生,经常我们会接触很多与中断相关的术语,按照软件和硬件进行分类: 硬件CPU相关: IRQ.IDT.cli&sti 软件操作系统相关: APC.DPC.I ...
- Code of Conduct
v
- hdu 2037简单贪心--活动安排问题
活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合,是可以用贪心算法有效求解的很好例子.该问题要求高效地安排一系列争用某一公共资源的活动.贪心算法提供了一个简单.漂亮的方法使得尽可能多的活动 ...