[New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传

时间:2021-11-25 13:32:32

  Windows Azure Platform 系列文章目录

  相关内容

  Windows Azure Platform (二十二) Windows Azure Storage Service存储服务之Blob详解(上)

  Windows Azure Platform (二十三) Windows Azure Storage Service存储服务之Blob详解(中)

  Windows Azure Platform (二十四) Windows Azure Storage Service存储服务之Blob详解(下)

  我们知道,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(IEnumerable<string> blockList, 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项目,重新选择之前同样的文件,程序会进行续传。(有兴趣的网友,可以在我的基础上继续修改。在关闭程序的时候,保存上传文件在本地的路径,下次续传的时候就不需要重新选择同样的文件路径了)

  

  相关截图:

  [New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传

参考资料:http://www.cnblogs.com/lijiawei/archive/2013/01/18/2866756.html