|
|
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
分享:
大家都在看
猜你喜欢

读 书 +更多

用户体验要素

本书是AJAX之父的经典之作。本书用简洁的语言系统化地诠释了设计、技术和商业融合是最重要的发展趋势。全书共8章,包括关于用户体验以及为...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊