博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[New Portal]Windows Azure Storage (14) 使用Azure Blob的PutBlock方法,实现文件的分块、离线上传...
阅读量:5786 次
发布时间:2019-06-18

本文共 2549 字,大约阅读时间需要 8 分钟。

 《》

  相关内容

  

  

  

 

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

  

  相关截图:

  

 

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

  

 

分类: 
本文转自Lei Zhang的博客博客园博客,原文链接:http://www.cnblogs.com/threestone/p/3211183.html,如需转载请自行联系原作者
你可能感兴趣的文章
linux常用命令100个(转)
查看>>
同时给两个变量值赋值
查看>>
DLNA介绍(包括UPnP)
查看>>
android之ScrollView里嵌套ListView(转)
查看>>
【Arduino】开发入门【八】舵机操作+源代码
查看>>
跨浏览器javascript
查看>>
Ubuntu 12.10安装配置JDK7环境
查看>>
精品_无限分类
查看>>
项目实现思路(不断更新)
查看>>
脚本程序gdb 脚本
查看>>
hdu 1497(图书管理系统模拟)
查看>>
ERP物料采购系统需求分析与效果展示 ERP实施以失败告终的四个原因分析
查看>>
GitHub上最火的40个Android开源项目(二)
查看>>
Jquery取得iframe中元素的几种方法Javascript Jquery获取Iframe的元素、内容或者ID,反之也行!...
查看>>
类查找android中跨项目的数据库操作ContentProvider的使用
查看>>
PostgreSQL在何处处理 sql查询之四
查看>>
#include<iostream>与#include<iostream.h>的区别
查看>>
安防硬件WIZnet基于全硬件TCP/IP的安防产品应用及方案
查看>>
外贸视频教程[外贸人zencart自助建站视频教程]:第一课
查看>>
项目管理潜规则之出差那些事
查看>>