当前位置:首页 > Web开发 > 正文

因此需要在HTTP头中申明本次需要续传的片段: Range:bytes=512000- 这个头通知服务端从文件的512K

2024-03-31 Web开发

所谓断点续传,其实只是指下载,也就是要从文件已经下载的处所开始继续下载。在以前版本的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回应,回应的内容为新的文件的全部数据。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32433.html