Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob、Queue、File 和 Table。浏览器
笔者在《Azure Table storage 基本用法》一文中,介绍了 Table Storage 的基本用法,本文将经过 C# 代码介绍 Blob Storage 的主要使用方法。app
Azure Blob Storage 是用来存放大量的像文本、图片、视频等非结构化数据的存储服务。咱们能够在任何地方经过互联网协议 http 或者 https 访问 Blob Storage。简单说,就是把文件放在云上,给它一个 URL,经过这个 URL 来访问文件。这就涉及到一个问题:如何控制访问权限?答案是咱们能够根据本身的须要,设置 Blob 对象是只能被本身访问,仍是能够被全部人访问。分布式
下面是 Blog Storage 典型的应用场景:工具
下图描述了 Blob Storage 的基本组织结构:性能
Storage Account 是用来管理 Azure Storage 的一个命名空间,主要用来控制存储数据的访问权限和计费。对于 Blob、Queue、File 和 Table 这些 Azure 提供的存储服务的访问控制,都是经过 Storage Account 来进行的,因此要想使用 Blob Storage,首先须要建立你的 Storage Account。优化
Container 中包含一组资源,全部的 Blob 都必须存在于Container中。一个 Storage Account 中能够包含无限个 Container,每一个Container中也能够包含无限个Blob。须要注意的是 Container 的名字必须所有小写。加密
一个Blob 就表明一个文件。为了区分应用的场景及提高不一样应用场景下存储的性能,又为 Blob 划分了不一样的类型:block blobs, page blobs,append blobs。spa
若是你还不熟悉 Azure Storage Account 的使用,以及如何经过 WindowsAzure.Storage 库访问 Azure Storage,请参考前文《Azure Table storage 基本用法》中的介绍。.net
为了方便查看 C# 代码执行的结果,本文使用了 MS 发布的一个 Azure Storage 客户端工具:Microsoft Azure Storage Explorer,文中简称为 Storage Explorer。日志
接下来咱们直接经过 C# 代码来介绍如何操做 Blob Storage。
因为任何一个 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 已经建立:
MSDN 上不厌其烦的描述 Blob Container 的名称规则,足以说明其重要性,本文试图以简要的文字进行描述:
违反任何一个规则,在建立 Blob Container 时都会受到 (400) Bad Request 错误。
咱们上传一个文件到刚才建立的 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 中的全部 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 对象的代码:
// 建立名称为 mypicture.png 的 Blob 对象的引用。 CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png"); // 把文件保存到本地。 using (var fileStream = System.IO.File.OpenWrite(fileName)) { blockBlob.DownloadToStream(fileStream); }
Mypicture.png 被下载到本地指定的文件中。
咱们在本文开始的地方就强调能够经过 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); }
从新在浏览器中访问一次试试:
注意,针对上传文件的权限须要谨慎处理,我的文件不建议设置为任何人都能访问。
mypicture.png 已经完成了演示的使命,经过如下命令就能够删除它了:
CloudBlockBlob blockBlob = container.GetBlockBlobReference("mypicture.png"); blockBlob.Delete();
Blob Storage 以其丰富的类型(block,append,page)为各种应用场景提供了最优的选择。本文仅仅是入门的介绍,更多的场景如用 Blob 存储设置 cdn ,如何对数据进行加密存储等内容都没有涉及。但愿对刚接触 Azure 的朋友有所帮助。