当前位置:网站首页>asp.net解决大文件断点续传
asp.net解决大文件断点续传
2022-08-04 11:24:00 【51CTO】
一、概述
所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。
二、Range
用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:
Range:用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始。典型格式:
Ranges: (unit=first byte pos)-[last byte pos]
Ranges: bytes=4000- 下载从第4000字节开始到文件结束部分
Ranges: bytes=0~N 下载第0-N字节范围的内容
Ranges: bytes=M-N 下载第M-N字节范围的内容
Ranges: bytes=-N 下载最后N字节内容
1.以下几点需要注意:
(1)这个数据区间是个闭合区间,起始值是0,所以“Range: bytes=0-1”这样一个请求实际上是在请求开头的2个字节。
(2)“Range: bytes=-200”,它不是表示请求文件开始位置的201个字节,而是表示要请求文件结尾处的200个字节。
(3)如果last byte pos小于first byte pos,那么这个Range请求就是无效请求,server需要忽略这个Range请求,然后回应一个200,把整个文件发给client。
(4)如果last byte pos大于等于文件长度,那么这个Range请求被认为是不能满足的,server需要回应一个416,Requested range not satisfiable。
2.示例解释:
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
三、Content-Range
用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:
Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]
四、Header示例
请求下载整个文件:
GET /test.rar HTTP/1.1
Connection: close
Host: 116.1.219.219
Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头
一般正常回应
HTTP/1.1 200 OK
Content-Length: 801
Content-Type: application/octet-stream
Content-Range: bytes 0-800/801 //801:文件总大小
一个最简单的断点续传实现大概如下:
1.客户端下载一个1024K的文件,已经下载了其中512K
2. 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:
Range:bytes=512000-
这个头通知服务端从文件的512K位置开始传输文件
3. 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:
Content-Range:bytes 512000-/1024000
并且此时服务端返回的HTTP状态码应该是206,而不是200。
但是在实际场景中,会出现一种情况,即在终端发起续传请求时,URL对应的文件内容在服务端已经发生变化,此时续传的数据肯定是错误的。如何解决这个问题了?显然此时我们需要有一个标识文件唯一性的方法。在RFC2616中也有相应的定义,比如实现Last-Modified来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。同时RFC2616中还定义有一个ETag的头,可以使用ETag头来放置文件的唯一标识,比如文件的MD5值。
终端在发起续传请求时应该在HTTP头中申明If-Match 或者If-Modified-Since 字段,帮助服务端判别文件变化。
另外RFC2616中同时定义有一个If-Range头,终端如果在续传是使用If-Range。If-Range中的内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时候。服务端在收到续传请求时,通过If-Range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。
相关参考链接: http://blog.ncmem.com/wordpress/2019/08/09/http%e6%96%ad%e7%82%b9%e7%bb%ad%e4%bc%a0/ 欢迎入群一起讨论:374992201
边栏推荐
- 秒云成功入选《2022爱分析 · 银行数字化厂商全景报告》,智能运维能力获认可
- 拦截器,文件流,下载文件?
- POJ2367Genealogical tree题解
- iMeta | German National Cancer Center Gu Zuguang published a complex heatmap visualization method
- 网管型交换机比傻瓜交换机多了哪些功能
- SkiaSharp 之 WPF 自绘 粒子花园(案例版)
- datax oracle to oracle离线json文件
- Leetcode brush questions - 543. Diameter of binary trees, 617. Merging binary trees (recursive solution)
- 手搓一个“七夕限定”,用3D Engine 5分钟实现烟花绽放效果
- 你知道吗?那些专属于代码的浪漫~
猜你喜欢
Win11怎么重装显卡驱动程序?Win11显卡驱动怎么卸载重装?
使用.NET简单实现一个Redis的高性能克隆版(二)
【LeetCode】653. 两数之和 IV - 输入 BST
Leetcode刷题——路径总和
【机器学习】:如何对你的数据进行分类?
多行函数;group_by分组;having分组后筛选;单表查询总结
云原生Devops 的实现方法
Leetcode brush questions - 543. Diameter of binary trees, 617. Merging binary trees (recursive solution)
Xilinx VIVADO 中 DDR3(Naive)的使用(1)创建 IP 核
【飞控开发高级教程7】疯壳·开源编队无人机-编队飞行
随机推荐
vector中函数emplace_back的实现原理
shell变量
*iframe*
bitset的基本用法
POJ1094Sorting It All Out题解
Business collocations
ECCV 2022 | 清华&腾讯AI Lab提出REALY: 重新思考3D人脸重建的评估方法
ORB-SLAM3中的优化
The use of DDR3 (Naive) in Xilinx VIVADO (1) to create an IP core
命令模式(Command)
【虹科案例】基于3D相机组装家具
datax oracle to oracle incremental synchronization
DB2查看执行过长的SQL
SkiaSharp 之 WPF 自绘 粒子花园(案例版)
Leetcode brush - structure binary tree (105. Once upon a time sequence and the sequence structure binary tree traversal sequence, 106. From the sequence with the sequence structure binary tree travers
【LeetCode】899.有序队列
Leetcode刷题——二叉搜索树相关题目(98. 验证二叉搜索树、235. 二叉搜索树的最近公共祖先、1038. 从二叉搜索树到更大和树、538. 把二叉搜索树转换为累加树)
123
The use of DDR3 (Naive) in Xilinx VIVADO (2) Read and write design
入门MySql表的增删查改