最近有一个客户需要将文件系统(VM搭建)迁移到Azure存储上,对于Azure存储这里就不多做介绍,但是该客户由于网络原因下载文件的时候经常出现上传中断,所以想在Azure 存储上实现下载的断点续传。下面我就用C#代码实现在Azure存储上下载断点续传,这里只提供一个示例,具体应用需结合业务调整。

由于在前面几篇Blog收到一些批评和建议,这里我们的示例代码也尽量符合实际开发规范。

首先配置Azure存储信息

下载断点续传

//存储连接字符串
static string connectionString = ConfigurationManager.AppSettings["StorageConnectionString"];
//存储容器名称
static string containerName = ConfigurationManager.AppSettings["StorageContainer"];
//一次下载数据块大小,这里我设置的是2MB
static int bufferSize = 1024 * 1024 * 2;
static void Main(string[] args)
{
//这里就直接指定一个存储中的Blob文件
string fileName = "aspnet-core.pdf";
DownloadBlockBlobBreakPoint(containerName, fileName);
Console.WriteLine("文件下载成功...");
Console.ReadKey();
} /// <summary>
/// 文件下载(断点续传)
/// </summary>
/// <param name="container"></param>
/// <param name="fileName"></param>
private static void DownloadBlockBlobBreakPoint(string container,string fileName)
{
//这里我没有返回文件流或者byte数组,而是直接在此接口中直接写文件,主要是图方便
//每一个存储中的Blob文件都有一个对应的记录该文件下载到哪一位置的文本文件
string flagFile = Path.GetFileNameWithoutExtension(fileName) + ".txt";
CloudBlockBlob blockBlob = GetBlockBlob(container, fileName);
byte[] buffer = new byte[bufferSize];
blockBlob.FetchAttributes();
long blobSize = blockBlob.Properties.Length;
int blobCount = (int)(blobSize / bufferSize) + 1;
int currentCount = 0;
if (!File.Exists(flagFile))
{
FileStream fs = File.Create(flagFile);
fs.Close();
fs.Dispose();
}else
{
string[] ids = File.ReadAllLines(flagFile);
currentCount = ids.Length;
}
for (int i = currentCount; i < blobCount; i++)
{
int totalNumber = blockBlob.DownloadRangeToByteArray(buffer, 0, currentCount * bufferSize, bufferSize);
Console.WriteLine(i.ToString());
if (totalNumber > 0)
{
using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write, FileShare.Write))
{
fs.Write(buffer, 0, buffer.Length);
}
File.AppendAllLines(flagFile, new List<string>() { Guid.NewGuid().ToString() });
currentCount++;
}
else
{
break;
}
}
} /// <summary>
/// 获取Azure存储中指定的Blob文件
/// </summary>
/// <param name="container"></param>
/// <param name="fileName"></param>
/// <returns></returns>
private static CloudBlockBlob GetBlockBlob(string container, string fileName)
{
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = blobClient.GetContainerReference(container);
blobContainer.CreateIfNotExists();
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference(fileName);
return blockBlob;
}

虽然客户只提出了下载断点续传,但是要写就索性写完整一点,下面我把上传断点续传也实现了。

/// <summary>
/// 文件上传(断点续传)
/// </summary>
/// <param name="container"></param>
/// <param name="path"></param>
private static void UploadBlockBlobBreakPoint(string container,string path)
{
string flagFile = Path.GetFileNameWithoutExtension(path) + ".txt";
string blobName = Path.GetFileName(path);
CloudBlockBlob blockBlob = GetBlockBlob(container, blobName); byte[] buffer = new byte[bufferSize];
int fileSize = File.ReadAllBytes(path).Length;
int fileCount = fileSize / bufferSize + ;
int currentCount = ;
List<string> blobIdList = new List<string>();
if (!File.Exists(flagFile))
{
FileStream fs = File.Create(flagFile);
fs.Close();
fs.Dispose();
}
else
{
string[] blobIds = File.ReadAllLines(flagFile);
currentCount = blobIds.Length;
blobIdList.AddRange(blobIds);
} for (int i = currentCount ; i < fileCount; i++)
{
using (FileStream fs=new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read,bufferSize))
{
fs.Read(buffer, , buffer.Length); } using(MemoryStream ms =new MemoryStream(buffer, , buffer.Length))
{
string blobId = Convert.ToBase64String(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString()));
blockBlob.PutBlock(blobId, ms, null);
blobIdList.Add(blobId);
File.AppendAllLines(flagFile, new List<string>() { blobId });
}
}
blockBlob.PutBlockList(blobIdList);
}

Azure存储上传下载(断点续传)的更多相关文章

  1. C#使用七牛云存储上传下载文件、自定义回调

    项目需要将音视频文件上传服务器,考虑并发要求高,通过七牛来实现. 做了一个简易的压力测试,同时上传多个文件,七牛自己应该有队列处理并发请求,我无论同时提交多少个文件,七牛是批量一个个排队处理了. 一个 ...

  2. 【FTP】FTP文件上传下载-支持断点续传

    Jar包:apache的commons-net包: 支持断点续传 支持进度监控(有时出不来,搞不清原因) 相关知识点 编码格式: UTF-8等; 文件类型: 包括[BINARY_FILE_TYPE(常 ...

  3. java实现多线程断点续传,上传下载

    采用apache 的 commons-net-ftp-ftpclient import java.io.File; import java.io.FileOutputStream; import ja ...

  4. FTP文件上传 支持断点续传 并 打印下载进度(二) —— 单线程实现

    这个就看代码,哈哈哈哈哈  需要用到的jar包是: <dependency> <groupId>commons-net</groupId> <artifact ...

  5. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  6. 如何利用京东云的对象存储(OSS)上传下载文件

    作者:刘冀 在公有云厂商里都有对象存储,京东云也不例外,而且也兼容S3的标准因此可以利用相关的工具去上传下载文件,本文主要记录一下利用CloudBerry Explorer for Amazon S3 ...

  7. 微信小程序云开发-云存储-上传、下载、打开文件文件(word/excel/ppt/pdf)一步到位

    一.wxml文件 <!-- 上传.下载.打开文件一步执行 --> <view class="handle"> <button bindtap=&quo ...

  8. Java Web 项目的文件/文件夹上传下载

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  9. js文件上传下载组件

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

随机推荐

  1. Java SSM框架之MyBatis3(一)MyBatis入门

    MyBatis3介绍 mybatis就是一个封装来jdbc的持久层框架,它和hibernate都属于ORM框架,但是具体的说,hibernate是一个完全的orm框架,而mybatis是一个不完全的o ...

  2. Selenium学习(Python)

    #从Selenium中导入Webdriver类,该类中定义了selenium支持的浏览器 # webdriver.Firefox # webdriver.FirefoxProfile # webdri ...

  3. html5 canvas结构基础

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 程序员与HR博弈之:有城府的表达你的兴趣爱好

    “面试”这个过程说简单其实也能很简单.譬如急需招某种技能的单位会因为你拥有某方面的经验或特长立马录取你,哪怕你其他方面表现的很“烂”. 从广义上来讲,很多公司尤其是大中型公司的招聘,并不是因为急缺某岗 ...

  5. 20155203 2016-2017-2 《Java程序设计》第7周学习总结

    20155203 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 1.Lambda表达式.(使用interface函数接口) 2.Lambda的方法参考Met ...

  6. windows环境命令行创建虚拟环境

    1:安装virtualenv pip install virtualenv 2:创建并激活虚拟环境 #创建虚拟环境 D:\>mkdir xianmu D:\>cd xianmu D:\xi ...

  7. 【ARTS】01_07_左耳听风-20181224~1230

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  8. java中URL 的编码和解码函数

    java中URL 的编码和解码函数java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);在javascri ...

  9. TinyHttpd代码解析

    十一假期,闲来无事.看了几个C语言开源代码.http://www.cnblogs.com/TinyHttpd 这里本来想解析一下TinyHttpd的代码,但是在网上一搜,发现前辈们已经做的很好了.这里 ...

  10. vscodes使用(一): 常用插件,在线与离线安装

    一.常用插件 1.Live server 浏览器实时刷新 插件安装成功后,会在底部工具栏中,显示个Go Live *.html文件,点击右键,可以看到live server两条指令   2.Esasy ...