《》
相关内容
我们知道,BLOB(大型二进制对象)数据是用来存储文件、图片、文档等二进制格式的文件。
BLOB分为2种:
-Block BLOB(区块型BLOB存储),这类的存储以4M为一个区块单位,单一文件最大可以存储200GB,且区块不会连续存储,可能会在不同的存储服务器分块存放。为了适应文件的上传和下载而专门进行了优化。当应用程序要求时,会一招文件的KEY以及区块存储区提供数据。
-Page BLOB,是优化的随机访问。它会在存储区中划分一个连续的区域供应用程序存放数据,它本身可以视为一个大型的VHD(虚拟机软盘)。如果我们拿我们的应用程序迁移到Windows Azure平台上,对于文件的读写操作可能需要进行一些修改,但是通过Page Blob就可以方便我们迁移:微软特别在Page BLOB上提供了一组将Page BLOB虚拟成软盘的功能,称为Windows Azure Drive(研发代号为XDrive),它能够支持NTFS API,也就是说应用程序可以利用现有的文件管理API(包含System.IO的类型)来访问Windows Azure Drive中的文件夹与文件数据,并且这些数据会保存在Windows Azure数据中心内。
BLOB服务由BLOB本身以及其收纳容器(Container)构成,容器可视为一般本机上的文件夹。而Blob就是保存某个文件。
Block Blobs可以通过2种方法创建。不超过64MB的Block Blobs可以通过调用PutBlob操作进行上传。大于64MB的Block Blobs必须分块上传,且每块的大小不能超过4MB。当所有的Block上传成功后,必须调用PutBlockList操作进行合并,成为连续的Blob。Block Blob目前最大支持200GB.
PubBlock:上传单个Block数据:
public void PutBlock(string blockId, Stream blockData, string contentMD5, AccessCondition accessCondition = null, BlobRequestOptions options = null, OperationContext operationContext = null);
-blockId,使用Base64编码格式,代表了唯一的Block
-blockData,block包含的数据流
-contentMD5,用来验证block完整性的哈希值,可以为Null或者是空
PubBlockList:根据blockId集合提交所有的block,并创建blob文件。只有提交以后,通过PutBlock上传的block数据才能成为Blob文件的一部分。
public void PutBlockList(IEnumerableblockList, AccessCondition accessCondition = null, BlobRequestOptions options = null, OperationContext operationContext = null);
-blockList:blockId集合
-options:给请求定义的额外的配置。
分块上传数据的步骤如下:
1.首先确定block的大小,Azure Blob规定最大不能超过4MB
2.通过FileStream的Read方法依次按量读取块数据,并依次调用PutBlock将块数据上传,每次上传时需要一个对应的blockId,上传成功以后将对应的blockId存储;
3.所有Block上传完成以后,调用PutBlockList提交将才上传的所有block,组成blob文件。(注意,对于未提交的Block数据,一个星期之内将被自动回收。)
断点续传设计:
1.假如上传的数据是100MB,每个block大小为1M。
2.当上传第50个block的时候关闭应用程序窗体。在关闭窗口的时候,
a)保存上传block的索引位置(例如第50个),至本地的文本文件。
b)保存上传成功的所有的block ID,至本地的文本文件。
3.重新打开应用程序窗体。在窗体启动的时候,读取本地保存的文本文件信息,获得上次退出时的block索引位置和所有的block ID
4.续传。从上次的block索引位置开始,继续传输剩下的block(从第51个开始)
5.传输完毕,调用PutBlockList方法,提交所有的Block Id,完成传输。并且删除本地的文本文件。
代码在下载
使用方法:
1.以管理员身份,运行VS2012,并且打开项目
2.修改Form1.cs中的storageConnectionString参数,将[Acount Name]和[Account Key]修改成你自己Azure Storage相关的信息。
修改GetBlockBlob函数中的[containerName]参数,设置成你自己Azure Storage Container中的信息
3.运行项目,点击浏览按钮,选择本地的文件。
4.点击开始,上传数据
5.在上传过程中,点击窗体的关闭按钮,退出程序。
6.重新启动VS项目,重新选择之前同样的文件,程序会进行续传。(有兴趣的网友,可以在我的基础上继续修改。在关闭程序的时候,保存上传文件在本地的路径,下次续传的时候就不需要重新选择同样的文件路径了)
相关截图:
参考资料:http://www.cnblogs.com/lijiawei/archive/2013/01/18/2866756.html