最近有一个客户需要将文件系统(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. amipy exampes

    jupyter notebook of backtest examples using amipy amipy examples: http://nbviewer.jupyter.org/github ...

  2. MQTT--入门【转】

    转自:https://blog.csdn.net/qq_28877125/article/details/78325003 一.简述  MQTT(Message Queuing Telemetry T ...

  3. ioctl函数详细说明(网络)

    ioctl 函数 本函数影响由fd 参数引用的一个打开的文件. #include<unistd.h> int ioctl( int fd, int request, .../* void ...

  4. 使用Eclipse运行第一个Go程序

    Windows 10家庭中文版,go version go1.11 windows/amd64, Eclipse IDE for C/C++ Developers Photon Release (4. ...

  5. 用Executors工具类创建线程池

    多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 线程池主要用来解决线程生命周期开销问题和资源不足问题.通过对多个任务重用线程,线程创建 ...

  6. 查看library的依赖树

    今天一同事问我如何解决包依赖重复的问题,我告诉他你可以用exclude,provide,compileOnly等关键字,他问我如何查找某个库依赖了什么,我说有一个插件,愣是想了好久没想起什么名字来,搜 ...

  7. MySQL自定义函数和存储过程的区别:

    自定义函数和存储过程的区别: 1)一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强.存储过程,功能强大,可以执行包括修改表等一系列数据库操作:用户定义函数不能用于执行一组修改全局 ...

  8. vs 加载 dll 缓慢

    https://jingyan.baidu.com/article/642c9d34e25cc2644b46f74b.html http://www.it610.com/article/2611781 ...

  9. HDR 视频编码

    前转换以及后转换:-f xxx.cfg (以及注意工作目录以及路径名/和//) HEVC视频编码:-c xxx.cfg  -c xx.cfg(视频的配置文件)

  10. 如何在CI中写工具类,在哪个目录写

    在Libraries目录写工具类,可以参考项目中七牛的集成写法 而Helps目录写的是辅助函数(公共函数)这一类的