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 典型的应用场景:

  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

 

时间: 2024-09-20 00:31:20

Azure Blob Storage 基本用法 -- Azure Storage 之 Blob的相关文章

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

Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table. 笔者在<Azure Blob Storage 基本用法>中介绍了 Blob Storage 的基本用法,本文将介绍 File Storage 的主要使用方法. File Storage 是什么? Azure File Storage 是一个通过 Server Message Block (SMB) 协议提供云端文件共享的服务.通过 File Stor

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

Azure Storage 是微软 Azure 云提供的云端存储解决方案,当前支持的存储类型有 Blob.Queue.File 和 Table,其中的 Table 就是本文的主角 Azure Table storage. Azure Table storage 是一个在云端存储结构化 NoSQL 数据的服务,它不仅存取速度快,而且效费比高.MSDN 上的说法是:成本显著低于传统 SQL! 笔者最近在项目中用 Table storage 实现了一个日志表,在此和大家分享一下 Table stora

azure-中国版 Windows Azure 和其它地区的 Azure 服务是否相同?

问题描述 中国版 Windows Azure 和其它地区的 Azure 服务是否相同? 中国版 Windows Azure 和其它地区的 Azure 服务是否相同? 解决方案 完全不同 山寨版的 azure 不是微软的,而是第三方运营的,只是用了微软的软件.本质上和一个网吧安装了几套微软的操作系统就开张了没有什么区别. 山寨版的 azure 拥有自己的机房,和微软 azure 的数据完全独立.azure 在全球拥有 7 个数据中心,而山寨版只有北京.上海两个. 山寨版的 azure 全程受政府严

azure 数据库过大 , Azure mobile service 出错

问题描述 azure 数据库过大 , Azure mobile service 出错 Hello ! 移动服务的数据库很大,有几千万,在mobile service端的DtoController里 public IQueryable<T> GetAllTDto() { return Query(); } 会发生超时错误,如果是Query().Take(100000) 只取100万条,可以简单查询,但是返回的结果并不是数据库中按顺序排列的: 另外,我设置成100万条 universal 客户端只

SAP WM Storage Type启用SUM之后需要指定storage type允许的Storage Unit Type

SAP WM Storage Type启用SUM之后需要指定storage type允许的Storage Unit Type                      

SAP WM 为Storage Type启用SUM后要为Storage Unit Type指派Storage Bin Type

SAP WM 为Storage Type启用SUM后要为Storage Unit Type指派Storage Bin Type                                

Azure Services Platform Step by Step 十 使用Blob Storage搭建简单网络硬盘

在上一篇中,我们已经介绍过Blob Storage的用途及其在Windows Azure Storage的地位.现在我们示范一下,如何用最简单的代码,将Blob Storage带入我们的生活. 最终效果如下图:(已部署到云端的Demo http://ibm.cloudapp.net/DriveC.aspx ) 虽然Windows Azure Storage都提供了REST的编程接口,但大家在实际编程中,根本不愿意去和繁琐的HttpWebRequest打交道吧?微软在这方面做得非常体贴,它将所有W

Windows Azure Virtual Machine(2) 创建Azure Virtual Machine

本章我将介绍如何创建一个简单的Virtual Machine.Windows Azure提供多种不同类型的Virtual Machine,包含Windows和Linux的版本.我将介绍如何创建一个已经预装好SQLServer 2012的Windows Azure VM. 1.首先我们登陆Windows Azure管理界面 https://manage.windowsazure.com/,输入您的用户名密码登陆. 2.登陆完毕后,点击New-->Virtual Machine-->From Ga

Storage网盘赚钱 Storage网盘如何挣钱

他人,只要有下载的,只要是通过链接形式的发布,有点想淘宝客推广的做法.     网盘推广方式     1.发帖   把链接发送出去,只要有需求的朋友看看到下载之后就会给你带来盈利.     2.seo优化   建设一个网站,把你的网盘链接放到网站上去,只要有排名带来流量.这样可以不用出太多劳动力就可以做好推广.     3.下线系统   每1000次下载最高10美元收益,下线提成10%.     如何支付   Storage可通过Paypal付款,请款后3个工作日内付款.