C#如何使用HttpClient对大文件进行断点上传和下载
什么是Http的断点上传和下载
断点上传:在向服务商上传大文件的时候,将一个大的文件拆分成多个小的文件,每个文件通过单独的Http请求上传给服务器。
断点下载:在向服务器请求下载一个大的资源文件的时候,不是一次Http请求返回所有的资源文件内容。而是先通过Head请求,拿到资源文件的大小(单位:字节)。然后每次请求只请求一部分字节的数据,将请求到的数据在本地进行拼接。
断点上传和下载的优点
1、避免网络中断时,重传所有资源文件内容。
2、提高服务器并发,防止单个客户端长时间和服务器保持连接。
3、可以实时显示上传和下载的进度。
断点上传和下载的缺点
1、占用更多的网络带宽,因为每次Http请求都会附带各种额外的信息。
2、上传和下载的时间会变得长一点,因为是通过多次请求来完成断点上传和下载。
实现基本原理
依赖Http协议的几个基本的协议头来完成断点上传和下载。
1、Content-Range:这是一个响应头,表示请求的资源文件大小,我们可以通过Head请求拿到的资源文件的字节数,就是读取的这个字段。
2、Range :这是一个请求头,表示客户端要请求的数组的范围。如如:"0-1000"、"1001-2000"、"2001-3000"等,服务器接收到这个请求头之后,只给我们返回对应范围内的资源字节数组,不会把所有的字节数都返回给我们。
一般请求下,这两个请求头就可以实现简单的断点上传和下载。本篇文章我们使用一个WPF项目演示断点下载。
string url = "http://file.cshelloworld.com/images/1771477326069108736.jpg";
long totalSize = 0;//文件总大小
long downLoadingSize = 0;//当前已经下载了多少
private void Button_Click(object sender, RoutedEventArgs e)
{
Task.Run(async () =>
{
//获取到文件总大小 通过head请求
using HttpClient client = new HttpClient();
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Head, url);
var response = await client.SendAsync(requestMessage);
totalSize = response.Content.Headers.ContentLength.Value;
using FileStream fileStream = new FileStream("d:\\a.jpj", FileMode.Create, FileAccess.Write, FileShare.Read);
//开始分片下载
while (downLoadingSize < totalSize)
{
//组装range 0,1000 1000,2000 0,9999
long start = downLoadingSize;
long end = start + 1000;
if (end > (totalSize - 1))
{
end = totalSize - 1;
}
client.DefaultRequestHeaders.Range = new System.Net.Http.Headers.RangeHeaderValue(start, end);
var res = await client.GetAsync(url);
byte[] bytes = await res.Content.ReadAsByteArrayAsync();
await fileStream.WriteAsync(bytes, 0, bytes.Length);
//更新UI的进度
downLoadingSize += bytes.Length;
int process = (int)((downLoadingSize / (decimal)totalSize) * 100);
this.Dispatcher.Invoke(() =>
{
cont.Text = process + "%";
this.processBar.Value = process;
});
}
fileStream.Close();
});
}
在以上代码中,首先是Head请求获取资源文件大小。
我们主要通过以下代码实现,通过设置HttpMethod.Head构建一个HttpRequestMessage的请求对象
HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Head, url);
其次是断点下载过程中,Range请求头如何设置:
client.DefaultRequestHeaders.Range = new System.Net.Http.Headers.RangeHeaderValue(start, end);
每次请求到字节数组之后,我们将字节数组写入到本地的文件流中,如果网络断开,下次请求的时候,读取本地文件大小,假设本地未见大小为1000,那么我们请求的时候Range就从1001开始,这样服务器就给我们返回的是1001之后的字节数组了。
当然在这个过程中,我们还要考虑一个问题,如果服务器的资源文件发生了修改会怎么样。如果我们继续下载的话 ,就会出现问题。因为客户端下载的文件都不是同一个文件。这种情况下,我们可以使用Http的请求头Last-Modified来判断文件是否修改,这个请求头表示文件的最近一次修改时间。当我们第一次请求数据的时候可以把这个请求头的时间记录下来,后续请求如果服务器资源文件发生变化,我们就将本地文件全部删除,然后重新发起请求。
联系站长

站长公众号

推荐阅读
C#如何使用HttpClient对大文件进行断点上传和下载的更多相关文章
- Java实现FTP文件与文件夹的上传和下载
Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...
- 与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载)
原文:与众不同 windows phone (13) - Background Task(后台任务)之后台文件传输(上传和下载) [索引页][源码下载] 与众不同 windows phone (13) ...
- Asp.Net MVC 文件管理Demo(文件展示,上传,下载,压缩,文件重命名等)
之前 ,有想做一个文件管理页面. 参考了 许多资料,终于完成了一个基于Asp.net MVC 的文件管理Demo.界面如下. 一,实现功能及相关技术 文件管理Demo基于Asp.NET MVC , ...
- 居于H5的多文件、大文件、多线程上传解决方案
文件上传在web应用中是比较常见的功能,前段时间做了一个多文件.大文件.多线程文件上传的功能,使用效果还不错,总结分享下. 一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件进行上传: 支 ...
- JS开发——文件夹的上传和下载
文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...
- B/S开发——文件夹的上传和下载
本人在2010年时使用swfupload为核心进行文件的批量上传的解决方案.见文章:WEB版一次选择多个文件进行批量上传(swfupload)的解决方案. 本人在2013年时使用plupload为核心 ...
- Java web开发——文件夹的上传和下载
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...
- 利用putty实现文件在linux上传和下载
利用putty实现文件上传和下载:1.打开windows命令提示符窗口d:(putty在d盘下)cd putty(pscp.exe所在目录)2:上传(主要利用pscp程序)pscp d:/jdk-8u ...
- pikachu 文件包含,上传,下载
一.文件包含 1.File Inclusion(local) 我们先测试一下,选择kobe然后提交 发现url出现变化 可以猜测此功能为文件包含,包含的文件为 file1.php,所以我在此盘符的根目 ...
- JavaScript开发——文件夹的上传和下载
我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...
随机推荐
- 开启Word、Excel、PPT时速度很慢的一种解决方法
本文介绍基于修改加载项,解决Microsoft Office系列软件开启速度较慢的办法. 最近,发现Excel软件的打开速度越来越慢,会在一定程度上影响工作效率.因此尝试对此加以解决.其中,本 ...
- rsync+ssh同步备份文件
定期对web代码或重要的文件做同步异地服务器备份,防止服务器故障严重磁盘损坏时文件丢失的问题. 备份服务器:192.168.200.134 目标服务器:192.168.201.65 rsync同步命令 ...
- [转]axios 的理解和使用
有废话少说,直接附上原文链接: axios 的理解和使用 axios.create(对axios请求进行二次封装) 拦截器 取消请求(axios.CancelToken) 其它链接: 1.axios中 ...
- C#中使用泛型对象(List<T>)对xml文件中的重复节点进行的序列化和反序列化
本文描述将对象(List<T>)序列化到 XML 文档中和从 XML 文档中反序列化为对象(List<T>). 命名空间: System.Xml.Serialization 程 ...
- 【吐血经验】在 windows 上安装 spark 遇到的一些坑 | 避坑指南
在 windows 上安装 spark 遇到的一些坑 | 避坑指南 最近有个活:给了我一个阿里云桌面(windows 10系统),让我在上面用 scala + spark 写一些东西. 总是报错不断, ...
- vs code 添加jquery的智能提示
1.安装node.js 2.新建VsCodeTestApp文件夹,用vs code打开这个文件夹 3.打开cmd,进入TestApp文件夹所在盘符,然后cd进入VsCodeTestApp C:\Use ...
- WPF test animation robot(simulate blink,mouse talk)
WPF 动画,模拟机器人眨眼,说话. using System; using System.Collections.Generic; using System.Linq; using System.T ...
- 第四章 dubbo源码解析目录
9.1 客户端发起请求源码 来看一下客户端请求代码: 1 DemoService demoService = (DemoService) context.getBean("demoServi ...
- w3cschool-微信小程序开发文档-API
https://www.w3cschool.cn/weixinapp/weixinapp-network-request.html 微信小程序API 发起请求 发起 HTTPS 网络请求.使用前请注意 ...
- Shenzi pg walkthrough Intermediate window
nmap └─# nmap -p- -A -sS -T5 192.168.218.55 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-12-16 ...