最近有一个客户需要将文件系统(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. javascript使用事件委托

    事件委托是javascript中一个很重要的概念,其基本思路就是利用了事件冒泡的机制,给上级(父级)元素触发事件的dom对象上绑定一个处理函数.在当有需要很多dom对象要绑定事件的情况下,可以使用事件 ...

  2. RabbitMq简单应用

    服务端: <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => ...

  3. 第12月第8天 Retrofit.builder

    1. retrofit = new Retrofit.Builder() .client(okHttpClient) .addConverterFactory(GsonConverterFactory ...

  4. 数链剖分(Tree)

    题目链接:https://cn.vjudge.net/contest/279350#problem/D 题目大意:操作,单点查询,区间取反,询问区间最大值. AC代码: #include<ios ...

  5. Linux下USB转串口的驱动【转】

    转自:http://www.linuxidc.com/Linux/2011-02/32218.htm Linux发行版自带usb to serial驱动,以模块方式编译驱动,在内核源代码目录下运行Ma ...

  6. php中数据库连接方式pdo和mysqli对比分析

    1)总的比较   PDO MySQLi 数据库支持 12种不同的数据库支持 支持MySQL API OOP OOP + 过程 Connection Easy Easy 命名参数 支持 不支持 对象映射 ...

  7. c#调用c++ dll 入坑记录

    1.DLL引用坑 [DllImport("NetDLL.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConve ...

  8. SharePoint 2013 另一个程序正在使用此文件,进程无法访问。 (异常来自 HRESULT:0x80070020)

    环境:SharePoint 2013 + Windows Server 2012 R2 在管理中心新建一个Web Application,端口为:88.顺利创建网站集后,打开访问却提示:无法显示此页 ...

  9. Entity Framework 6.1.0 Tools for Visual Studio 2012 & 2013

    http://www.microsoft.com/en-us/download/confirmation.aspx?id=40762

  10. TcxGrid 调整列位置的事件