zoukankan      html  css  js  c++  java
  • 【转载】Azure Blob Storage 云存储中实现大文件分块断点续传

    Blob 服务提供二进制文件和文本文件的存储。通过Blob的 REST API 能够访问2种资源: Containers 和 Blobs。容器可以看做包含多个文件的文件夹,而blob便是属于某个容器的文件。有如下2种blob:

    • Block Blobs: 该类型用于流式访问。
    • Page Blobs: 该类型用于随机读写操作,能够向blob中写入一部分字节。

    Block Blobs 可以通过2种方法创建。 不超过64MB 的Block blobs 可以通过调用Put Blob 操作进行上传。大于64 MB的 Block blobs 必须分块上传,每块不超过4MB。当所有的分块成功上传之后,通过调用Put Block List操作进行合并,成为单个连续的blob。Block blob目前最大支持200GB。

    Page blobs 可以由调用Put Blob操作来创建和初始化,支持最大尺寸。通过调用Put Page  操作,向page blob写入内容。Page blob 目前最大支持 1 TB。

    Blobs 支持条件更新,更多请参见:

    以下代码实现PutBlock文件块,最后需调用 PutBlockList实现最后写入文件。

    主要代码如下:(PutBlock返回的blockIds数组,最后要将此数组传入PutBlockList)

    [csharp] view plaincopy
    1. // Put block - upload a block (portion) of a blob.   
    2. // Return true on success, false if already exists, throw exception on error.  
    3. public bool PutBlock(string containerName, string blobName, int blockId, string[] blockIds, byte[] content)  
    4. {  
    5.     try  
    6.     {  
    7.         CloudBlobContainer container = BlobClient.GetContainerReference(containerName);  
    8.         CloudBlockBlob blob = container.GetBlockBlobReference(blobName);  
    9.   
    10.         string blockIdBase64 = Convert.ToBase64String(System.BitConverter.GetBytes(blockId));  
    11.   
    12.         UTF8Encoding utf8Encoding = new UTF8Encoding();  
    13.         using (MemoryStream memoryStream = new MemoryStream(content))  
    14.         {  
    15.             blob.PutBlock(blockIdBase64, memoryStream, null);  
    16.         }  
    17.   
    18.         blockIds[blockId] = blockIdBase64;  
    19.   
    20.         return true;  
    21.     }  
    22.     catch (StorageClientException ex)  
    23.     {  
    24.         if ((int)ex.StatusCode == 404)  
    25.         {  
    26.             return false;  
    27.         }  
    28.   
    29.         throw;  
    30.     }  
    31. }  
    32.   
    33.   
    34. // Put block list - complete creation of blob based on uploaded content.  
    35. // Return true on success, false if already exists, throw exception on error.  
    36.   
    37. public bool PutBlockList(string containerName, string blobName, string[] blockIds)  
    38. {  
    39.     try  
    40.     {  
    41.         CloudBlobContainer container = BlobClient.GetContainerReference(containerName);  
    42.         CloudBlockBlob blob = container.GetBlockBlobReference(blobName);  
    43.        
    44.         blob.PutBlockList(blockIds);  
    45.   
    46.         return true;  
    47.     }  
    48.     catch (StorageClientException ex)  
    49.     {  
    50.         if ((int)ex.StatusCode == 404)  
    51.         {  
    52.             return false;  
    53.         }  
    54.   
    55.         throw;  
    56.     }  
    57. }  


    下图显示用PutBlock,PutBlockList上传10MB单个文件结果:

    原文:

    http://blog.csdn.net/lihonggen0/article/details/6924107 

  • 相关阅读:
    C++中虚继承的作用
    游戏程序设计学习初窥简单DirectX代码实现
    vue4.x更改默认端口 larry
    Visual studio 2010几个比较酷的功能
    Web前端编程:勿混淆NodeList与Array
    代码规范之署名
    一则中文文件名引起的问题
    C# WebService调用及数据并行处理
    2010年终总结
    关于DotNetNuke
  • 原文地址:https://www.cnblogs.com/dlbrant/p/2430035.html
Copyright © 2011-2022 走看看