|
|
51CTO旗下网站
|
|
移动端

3.3.5 分块上传大文件

《Microsoft Azure 管理与开发(下册)平台服务PaaS》本书由世纪互联蓝云Microsoft Azure 开发技术支持团队的资深工程师们编写,主要阐述MicrosoftAzure PaaS 服务的开发应用,涉及计算服务、集成认证服务、数据存储服务、大数据服务等方面的内容。本节为大家介绍分块上传大文件。

作者:世纪互联蓝云公司来源:电子工业出版社|2018-07-13 12:25

3.3.5 分块上传大文件

大文件的网络传输是一件非常有挑战性的事情,上传大文件到存储服务一般有两种典型场景,即C/S 和B/S。存储服务单个Blob 文件***可达4.75TB,因此无论哪种场景,上传大文件(百兆字节以上)都需要基于分块上传来实现,一般实现原理如下:

(1) 首先,根据文件大小计算拆分的块数及块的大小。比如100MB 的文件,拆分成100 个Block,每个Block 大小为1MB。

(2) 其次,基于设定块的大小读取响应偏移量的数据,并依次调用PutBlock 上传数据块。

(3) ***,在所有数据块上传后,调用PutBlockList 提交 所有的Block,将其聚合成Blob 文件。

存储服务客户端SDK 提供了上传块文件(PutBlock)和聚合块文件(PutBlockList)的API 接口,这使得分块上传实现变得简单。代码示例如下:

  1. CloudBlockBlob blob = cloudBlobContainer.GetBlockBlobReference(Path.  
  2. GetFileName(fileName));  
  3. int blockSize = 1024 * 1024;  
  4. using (FileStream fileStream =  
  5. new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.  
  6. ReadWrite))  
  7. {  
  8. long fileSize = fileStream.Length;  
  9. int blockCount = (int)((float)fileSize / (float)blockSize) + 1;  
  10. List<string> blockIDs = new List<string>();  
  11. int blockNumber = 0;  
  12. try  
  13. {  
  14. int bytesRead = 0; //number of bytes read so far  
  15. long bytesLeft = fileSize;  
  16. while (bytesLeft > 0)  
  17. {  
  18. blockNumber++;  
  19. int bytesToRead;  
  20. if (bytesLeft >= blockSize)  
  21. {  
  22. bytesToRead = blockSize;  
  23. }  
  24. else  
  25. {  
  26. bytesToRead = (int)bytesLeft;  
  27. }  
  28. string blockId =  
  29. Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes(string.Format  
  30. ("BlockId{0}",  
  31. blockNumber.ToString("0000000"))));  
  32. blockIDs.Add(blockId);  
  33. byte[] bytes = new byte[bytesToRead];  
  34. fileStream.Read(bytes, 0, bytesToRead);  
  35. string blockHash = GetMD5HashFromStream(bytes);  
  36. blob.PutBlock(blockId, new MemoryStream(bytes), blockHash);  
  37. bytesRead += bytesToRead;  
  38. bytesLeft -bytesToRead;  
  39. }  
  40. blob.PutBlockList(blockIDs);  
  41. }  
  42. catch (Exception ex)  
  43. {  
  44. System.Diagnostics.Debug.Print("Exception thrown = {0}", ex);  
  45. }  


喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

289人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

645人订阅学习

WOT2019全球人工智能技术峰会

WOT2019全球人工智能技术峰会

通用技术、应用领域、企业赋能三大章节,13大技术专场,60+国内外一线人工智能精英大咖站台,分享人工智能的平台工具、算法模型、语音视觉等技术主题,助力人工智能落地。
共50章 | WOT峰会

0人订阅学习

读 书 +更多

黑客入侵的主动防御

本书是一本非常全面地讲述黑客入侵主动防御技术的网络安全工具书。本书的重点是介绍黑客的攻击手段和提供相应的主动防御保护措施,在组织结...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客