Azure 基础:Blob Storage
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table。
笔者在前文中介绍了 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。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 的名称规则,足以说明其重要性,本文试图以简要的文字进行描述:
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);
}
重新在浏览器中访问一次试试:
可要小心哟,要是不小心把私密的文件放到了这个 Container 中可就惨了!
删除 Blob 文件
mypicture.png 已经完成了演示的使命,可以删除它了:
CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png");
blockBlob.Delete();
总结
Blob Storage 以其丰富的类型(block, append, page)为各类应用场景提供了最优的选择。本文仅仅是入门的介绍,更多的场景如用 Blob 存储设置 cdn ,如何对数据进行加密存储等内容都没有涉及。希望对刚接触 Azure 的朋友有所帮助。
Azure 基础:Blob Storage的更多相关文章
- [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 Blob Storage从入门到精通
今天推荐的是一个系列文章,让读者阅读完成后可以对Azure Blob Storage的开发有一个全面的了解,可谓是从入门到精通. Azure在最初的版本里面就提供了非结构化数据的存储服务,也即Blob ...
- Python 操作 Azure Blob Storage
笔者在<Azure 基础:Blob Storage>一文中介绍了 Azure Blob Storage 的基本概念,并通过 C# 代码展示了如何进行基本的操作.最近笔者需要在 Linux ...
- Azure Functions(二)集成 Azure Blob Storage 存储文件
一,引言 上一篇文章有介绍到什么是 SeverLess ,ServerLess 都有哪些特点,以及多云环境下 ServerLess 都有哪些解决方案.在这众多解决方案中就包括 Function App ...
- Azure Blob Storage 基本用法 -- Azure Storage 之 Blob
Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Table storage ...
- Windows Azure Storage (19) 再谈Azure Block Blob和Page Blob
<Windows Azure Platform 系列文章目录> 请读者在参考本文之前,预习相关背景知识:Windows Azure Storage (1) Windows Azure St ...
- presto访问 Azure blob storage
当集群使用Azure Blog Storage时,prestoDB无法获取返回结果,在此记录下 如下,hive里面的两个表,一个使用的是本地的hdfs,一个是使用 azure blob storage ...
- DW(六):polybase访问Azure Blob Storage
目录: 连接hadoop配置语法 配置hadoop连接 Pushdown配置 Create external tables for Azure blob storage 连接hadoop配置语法: g ...
- hadoop(四): 本地 hbase 集群配置 Azure Blob Storage
基于 HDP2.4安装(五):集群及组件安装 创建的hadoop集群,修改默认配置,将hbase 存储配置为 Azure Blob Storage 目录: 简述 配置 验证 FAQ 简述: hadoo ...
随机推荐
- Asp .net core api+Entity Framework 实现数据的存取到数据库中
最近在学dotNetCore 所以尝试了一下api 这个功能 不多说了大致实现如下 1.用vs2017建立一个Asp.net Core Web 应用程序 在弹出的对话框中选择 Web API 项目名 ...
- JavaEE开发之SpringMVC中的静态资源映射及服务器推送技术
在上篇博客中,我们聊了<JavaEE开发之SpringMVC中的自定义拦截器及异常处理>.本篇博客我们继续的来聊SpringMVC的东西,下方我们将会聊到js.css这些静态文件的加载配置 ...
- Asp.Net 网站一键部署技术(上)
用垃圾而不稳定的网速上传N次压缩包都传不上去? 手动决定哪些覆盖不覆盖? 覆盖了web.config又要手动修改连接字符串? 不注意把原有配置搞丢了? …… 貌似从此早下班和休假与你无缘了. 所以!! ...
- 《分布式Java应用之基础与实践》读书笔记四
Java代码作为一门跨操作系统的语言,最终是运行在JVM中的,所以对于JVM的理解就变得非常重要了.整体上,我们可以从三个方面来深入理解JVM. Java代码的执行 内存管理 线程资源同步和交互机制 ...
- (知识点)JS获取网页高度
网页可见区域的宽:document.body.clientWidth 网页可见区域的高:document.body.clientHeight 网页可见区域的宽:document.body.offset ...
- c#读取html
第一部分:读取后,再次存入到源文件中Stream myStream = new FileStream("d:\\hhh.html", FileMode.Open);Encoding ...
- Linux系统管理10——进程和计划任务管理
Linux系统管理10——进程和计划任务管理 一.程序和进程的关系 1.程序 ·保存在硬盘.光盘等介质中的可执行代码和数据 ·静态保存的代码 2.进程 ·在CPU及内存中运行的程序代码 ·动态执行的代 ...
- 《快学Scala》——数组、映射和元组
数组 定长数组:在Scala中可以用Array,初始化一个定长数组.例如: val nums = new Array[Int](10) //10个整数的数组,所有元素初始化为0 val a = new ...
- [刷题]算法竞赛入门经典 3-1/UVa1585 3-2/UVa1586 3-3/UVa1225
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO(我也是在网上找到的pdf,但不记得是从哪里搜刮到的了,就重新上传了一遍) PS:第一次写博客分享我的代码,不知道我对c ...
- 谈谈我的session跨域处理方法
情景:公司的一个网站有一个模块(测试模块)需要单独用另外的一个域名(www.btest.com)去访问,即网站需要用两个不同的域名去访问,如首页(www.abc.com)和测试模块(www.xyz.c ...