在上一篇中,我们已经介绍过 Blob Storage 的用途及其在 Windows Azure Storage 的地位。现在我们示范一下,如何用最简单的代码,将 Blob Storage 带入我们的生活。
最终效果如下图:(已部署到云端的 Demo http://ibm.cloudapp.net/DriveC.aspx)
虽然 Windows Azure Storage 都提供了 REST 的编程接口,但大家在实际编程中,根本不愿意去和繁琐的 HttpWebRequest 打交道吧?微软在这方面做得非常体贴,它将所有 Windows Azure Storage 的 REST 编程接口都封装到了 C# 类中,这些类全部包含在 里。我们在实际开发时,只需要引用该 Project 或者它编译成的 dll,就可以告别裸露的 REST,使用那些非常方便的类和方法了!
项目的结构如下图。
该 Project 中分别定义了三个 Windows Azure Storage 服务的抽象类(如BlobStorage.cs),同时定义了与抽象类吻合的封装 REST 实现方法的类(如RestBlobStorage.cs)。RestBlobStorage 就是本文中将要使用的明星类。
以下是关键步骤(拖控件之类的简单步骤就不示范了,请参考文末附件中的详细代码)。
第一步:
在新建 VS008 中新建 Web Cloud Service。配置好 ServiceConfiguration.cscfg、ServiceDefinition.csdef 和 WebRole 下的 Web.Config 文件。具体方法见Azure Services Platform Step by Step-(8) 开发部署Azure留言板。
第二步:
在 WebRole 项目中添加对项目的引用。项目可以在 Azure SDK 中找到。本文篇末附件里也可以直接下载。
第三步:
在 Page 中定义 BlobContainer 类型的私有变量。
private BlobContainer container;
BlobContainer 封装了所有有关 Blob 的方法,可以说是非常强大,如下图:
第四步:
从配置文件中读取有关 Blob 账户、Container 名称的配置,新建 Container,传入 BlobContainer 的实体.
private BlobContainer GetContainer() { BlobStorage blobStorage =
BlobStorage.Create(StorageAccountInfo.GetDefaultBlobStorageAccountFromConfiguration()); BlobContainer container = blobStorage.GetBlobContainer(ConfigurationManager.AppSettings["containerName"]); container.CreateContainer(null, ContainerAccessControl.Public); return container; }
这步可以看成是初始化 BlobContainer 实体的操作。
第五步:
在 Blob 中写入文件的方法。
private void SaveFileToCloud(string id, string description, string fileName,
string contentType, byte[] data,string size) { //BlobProperties类,顾名思义,Blob的属性集 BlobProperties properties =
new BlobProperties(string.Format(CultureInfo.InvariantCulture, "file_{0}", id)); //每个Blob都可以附带一些自定义属性(Metadata)。
//此例中,我们先随意附上Id,OrdinaryFileName,Description这三组属性。 NameValueCollection metadata = new NameValueCollection(); metadata[Server.UrlEncode( "资源编号(新文件名)")] = id; metadata[Server.UrlEncode( "原始文件名")] =Server.UrlEncode( fileName); metadata[Server.UrlEncode( "描述")] =
Server.UrlEncode(String.IsNullOrEmpty(description) ? "null" : description); metadata[Server.UrlEncode( "文件大小")] = size; metadata[Server.UrlEncode("上传时间")] = DateTime.Now.ToString(); properties.Metadata = metadata; properties.ContentType = contentType; //BlobContents即Blob内容,以byte[]的形式传入 BlobContents fileBlob = new BlobContents(data); //省去REST的麻烦,直接调用CreateBlob方法。需要传入的参数:Blob属性集、Blob内容、是否覆盖同名 container.CreateBlob(properties, fileBlob, true); }
注意:metadata[] 的 name 和 value 均不支持中文。如果需要引入中文的 metadata,我采用的方法是对所有的 name 和 value 进行 UrlEncode,在页面显示的时候再 UrlDecode。
如:
metadata[Server.UrlEncode( "原始文件名")] =Server.UrlEncode( fileName);
第六步:
删除云端文件的方法:
if (this.container.DoesBlobExist(blobName))//如果文件存在 { this.container.DeleteBlob(blobName); //删除之 }
同样是使用 BlobContainer 类中的方法,非常容易。
第七步:
在 WebRole 项目的 Web.Config 文件中的
<system.web>节下设置
<httpRuntime maxRequestLength="2097151" executionTimeout="3600" />
为什么要要这样做?
2097151B=2MB,即 IIS 能够处理一次请求的最大数据。也就是说,在正常情况下,你是无法直接上传大于 2M 的文件的。
在 BlobContainer.CreateBlob() 方法中,已经封装了对大文件(大于 2M 的文件)的处理。处理方式即分块方式(Block,详见Azure Services Platform Step by Step-(9) Windows Azure Storage概览。
好了,到目前为止,我们已经学会:取得 Blob Storage 认证、建立 Container、得到 Container 的实体、在 Container 中存储 Blob、删除 Blob、设置与获取 Blob 的 metadata 属性。
是不是很容易呢?
代码下载:
【寻根问底】StorageClient 项目中 Block 处理过程的代码