http的Range协议为这些应用提供了基础:
1. 文件的多线程并行分片上传和下载(迅雷等各种BT软件所依赖),
2. 文件的断点续传
3. 视频直播的一种技术选型,更专业的是使用rtmp协议
#不支持
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设置为文件的小写。