http的Range协议

http的Range协议为这些应用提供了基础:

1. 文件的多线程并行分片上传和下载(迅雷等各种BT软件所依赖),

2. 文件的断点续传

3. 视频直播的一种技术选型,更专业的是使用rtmp协议

服务端表明自己是否支持Range协议


#不支持
Accept-Ranges: none
#支持
Accept-Ranges: bytes

客户端下载数据

请求头格式Range: bytes=100-500,注意范围是内包含的,即包含第500个字节。故而Range: bytes=0-0是合法的,即取第一个字节。服务端返回格式Content-Range: bytes 100-500/1000,1000表示整个文件长度,此时返回头应该有Content-Length: 401。

Range头域可以请求实体的一个或者多个子范围。例如,  
表示头500个字节:bytes=0-499  
表示第二个500字节:bytes=500-999  
表示最后500个字节:bytes=-500  
表示500字节以后的范围:bytes=500-  
第一个和最后一个字节:bytes=0-0,-1  
同时指定几个范围:bytes=500-600,601-999

当范围合法,而没有返回全部,服务端返回200,或者是206(Partial Content)。当范围不合法时,返回416(Range Not Satisfiable)。

客户端上传数据

上传通常使用PUT方法。如果要支持断点续传,通常是客户端先HEAD一下服务端,询问一下已经上传的文件的大小、签名(ETag),做完校验后开始上传。上传的头格式跟下载时服务端返回的一致,也是Content-Range: bytes 100-500/1000,表明此次上传的数据区间和整个文件的大小。

下面罗列使用curl进行Range上传、下载文件的用例:


#上传
curl -X PUT 'https://www.example.com/upload/abcdef'  -T big.pdf
#下载
curl -X GET 'https://www.example.com/download/abcdef'  -o ./tmp.pdf
#分三块下载
curl -X GET 'https://www.example.com/download/abcdef'  -r 0-500 -o ./tmp0.pdf
curl -X GET 'https://www.example.com/download/abcdef'  -r 501-1000 -o ./tmp1.pdf
curl -X GET 'https://www.example.com/download/abcdef'  -r 1001- -o ./tmp2.pdf
cat tmp0.pdf tmp1.pdf tmp2.pdf > tmp.pdf
#续传
curl -X PUT 'https://www.example.com/upload/abcdef' -C 374000  -T big.pdf
#区间上传
curl -X PUT 'https://www.example.com/upload/abcdef' -r 0-500  -T ./tmp0.pdf

特别注意:上例中续传时,big.pdf和tmp0.pdf需要自行处理为相应区间的数据,curl只是傻乎乎地将Content-Length设置为文件的小写。

发表于 2018-01-20 17:33   修改于 2018-04-03 00:53   评论:0   阅读:39  



回到顶部

首页 | 关于我 | 关于本站 | 站内留言 | rss
python logo   django logo   tornado logo