IE的自带下载功能中没有断点续传功能,要实现断点续传功能,需要用到HTTP协议中鲜为人知的几个响应头和请求头。

一. 两个必要响应头Accept-Ranges、ETag

客户端每次提交下载请求时,服务端都要添加这两个响应头,以保证客户端和服务端将此下载识别为可以断点续传的下载:

Accept-Ranges:告知下载客户端这是一个可以恢复续传的下载,存放本次下载的开始字节位置、文件的字节大小;

ETag:保存文件的唯一标识(我在用的文件名+文件最后修改时间,以便续传请求时对文件进行验证);

Last-Modified:可选响应头,存放服务端文件的最后修改时间,用于验证

二. 一个重要请求头Range

Range:首次下载时,Range头为null,此时服务端的响应头中必须添加响应头Accept-Ranges、ETag;

续传请求时,其值表示客户端已经收到的字节数,即本次下载的开始字节位置,服务端依据这个 值从相应位置读取数据发送到客户端。

三. 用于验证的请求头If-Range、

当响应头中包含有Accept-Ranges、ETag时,续传请求时,将包含这些请求头:

If-Range:对应响应头ETag的值;

Unless-Modified-Since:对应响应头Last-Modified的值。

续传请求时,为了保证客户端与服务端的文件的一致性和正确性,有必要对文件进行验证,验证需要自己写验证代码,就根据解析这两个请求头的值,将客户端已下载的部分与服务端的文件进行对比,如果不吻合,则从头开始下载,如果吻合,则断点续传。

四.  速度限制

程序中加入了速度限制,用于对客户端进行权限控制的流量限制。

五. 其它注意事项

如:文件名乱码的问题、文件名中空格变加号、强制客户端显示下载对话框等,详见源码注释:

1

2        /// <summary>

3        /// 下载文件,支持大文件、续传、速度限制。支持续传的响应头Accept-Ranges、ETag,请求头Range 。

4        /// Accept-Ranges:响应头,向客户端指明,此进程支持可恢复下载.实现后台智能传输服务(BITS),值为:bytes;

5        /// ETag:响应头,用于对客户端的初始(200)响应,以及来自客户端的恢复请求,

6        /// 必须为每个文件提供一个唯一的ETag值(可由文件名和文件最后被修改的日期组成),这使客户端软件能够验证它们已经下载的字节块是否仍然是最新的。

7        /// Range:续传的起始位置,即已经下载到客户端的字节数,值如:bytes=1474560- 。

8        /// 另外:UrlEncode编码后会把文件名中的空格转换中+(+转换为%2b),但是浏览器是不能理解加号为空格的,所以在浏览器下载得到的文件,空格就变成了加号;

9        /// 解决办法:UrlEncode 之后, 将 "+" 替换成 "%20",因为浏览器将%20转换为空格

10        /// </summary>

11        /// <param name="httpContext">当前请求的HttpContext</param>

12        /// <param name="filePath">下载文件的物理路径,含路径、文件名</param>

13        /// <param name="speed">下载速度:每秒允许下载的字节数</param>

14        /// <returns>true下载成功,false下载失败</returns>

15        public static bool DownloadFile(HttpContext httpContext, string filePath, long speed)

16        {

17            bool ret = true;

18            try

19            {

20                --验证:HttpMethod,请求的文件是否存在

36

37                定义局部变量

49

50                --验证:文件是否太大,是否是续传,且在上次被请求的日期之后是否被修改过--------------

67

68                try

69                {

70                    -------添加重要响应头、解析请求头、相关验证-------------------

97

98                    -------向客户端发送数据块-------------------

108                }

109                catch

110                {

111                    ret = false;

112                }

113                finally

114                {

115                    br.Close();

116                    myFile.Close();

117                }

118            }

119            catch

120            {

121                ret = false;

122            }

123            return ret;

124        }

上传展示截图:

详细配置信息可以参考我写的这篇文章:http://blog.ncmem.com/wordpress/2019/08/09/net%E6%96%AD%E7%82%B9%E7%BB%AD%E4%BC%A0/

使用webuploader实现大文件断点续传的更多相关文章

  1. webuploader解决大文件断点续传

    文件夹数据库处理逻辑 public class DbFolder { JSONObject root; public DbFolder() { this.root = new JSONObject() ...

  2. HTML5 大文件断点续传完整思路整理

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

  3. B/S大文件断点续传

    一. 功能性需求与非功能性需求 要求操作便利,一次选择多个文件和文件夹进行上传:支持PC端全平台操作系统,Windows,Linux,Mac 支持文件和文件夹的批量下载,断点续传.刷新页面后继续传输. ...

  4. iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载+使用输出流代替文件句柄

    前言:本篇讲解,在前篇iOS开发之网络编程--使用NSURLConnection实现大文件断点续传下载的基础上,使用输出流代替文件句柄实现大文件断点续传.    在实际开发中,输入输出流用的比较少,但 ...

  5. php实现大文件断点续传下载实例

    php实现大文件断点续传下载实例,看完你就知道超过100M以上的大文件如何断点传输了,这个功能还是比较经典实用的,毕竟大文件上传功能经常用得到. require_once('download.clas ...

  6. webUploader实现大文件分片,断点续传

    问题: 公司现在的业务需求是要上传一个大文件,上一次写了一篇博客,做了一个简单的文件上传,支持单文件,大型文件上传 现在对之前的上传进行优化,支持断点续传,秒传功能 上次博客:[http://www. ...

  7. 单文件WebUploader做大文件的分块和断点续传

    前言: WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流 ...

  8. webUploader大文件断点续传学习心得 多文件

    二.Jsp代码: <!-- 断点续传   start--> <!-- 隐藏域 实时保存上传进度 --> <input id="jindutiao" t ...

  9. php使用WebUploader做大文件的分块和断点续传

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

随机推荐

  1. golang日志库之glog使用问题总结

    1. 日志默认输出路径为临时路径,可通过执行命令时带上 -log_dir="路径",指定输出,但路径必须已存在,源码如下,日志文件会生成两个 .INFO等后缀是符号链接文件,另一个 ...

  2. IOS微信浏览器返回事件监听问题

    业务需求:从主页进入A订单页面,然后经过各种刷新或点标签加载后点左上角的返回直接返回到主页 采取方法:采用onpopstate事件监听url改变,从而跳转到主页 遇到的问题:安卓上测试没问题:苹果手机 ...

  3. C#导入Excel表格功能aspx.cs(代码)

    using System; using System.Data; using System.Configuration; using System.Collections; using System. ...

  4. 一、zuul如何路由到上游服务器

    所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 zuul在分布式项目中充当着一个网关的角色,而它最主要的功能像nginx一样针对上游服务 ...

  5. 1 spring如何通过组件扫描和自动装配实现自动化的配置

    1 首先将spring依赖的包全部导入 2 建立测试接口 public interface CompactDisc { void play(); } 3 具体的类实现接口 import org.spr ...

  6. shell 文本处理三剑客之 grep 和 egrep

    shell 三剑客之 grep 命令语法格式 grep 参数 案例 显示file中有python的行 grep python file 显示没有python的行,不忽略大小写 grep -v pyth ...

  7. CentOS7安装CDH 第十一章:离线升级CDH版本

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

  8. Android笔记(十九) Android中的Fragment

    通常我们使用Activity来展示界面,但是在手机上界面可能显示的很好看,但在平板上,因为平板的屏幕非常大,手机的界面放在平板上可能会出现控件被拉长.控件之间间距变大等问题.为了更好的体验效果,在Ac ...

  9. Python基础Day7

    七步记忆法: ① 预习(30min) ② 听课 (重点) ③ 课间练习 ④ 下午或者晚上练习(大量练习.重复练习)⑤ 晚上睡觉前的回忆 ⑥ 第二天早晨回顾 ⑦ 每周总结,自己默写方法 一.enumer ...

  10. microsoft office 2007 在已经安装pdf maker的情况下另存为没有adobe pdf选项

    通常,此类情况是pdf maker 插件被禁用导致,点击office 2007左上角菜单栏,选项,加载项,在管理处选择禁用项目, 找到acrobat pdf maker office com addi ...