一,HTTP断点续传
1,关于HTTP断点续传,看这个博客,讲的清晰明了
2,通过上面的博客,我们可以了解到4个概念或字段
I: Range,用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式如下:
Range: bytes=0-499 表示第 0-499 字节范围的内容
Range: bytes=500-999 表示第 500-999 字节范围的内容
Range: bytes=-500 表示最后 500 字节的内容
Range: bytes=500- 表示从第 500 字节开始到文件结束部分的内容
Range: bytes=0-0,-1 表示第一个和最后一个字节
Range: bytes=500-600,601-999 同时指定几个范围
II: Content-Range,用于响应头中,在发出带 Range 的请求后,服务器会在 Content-Range 头部返回当前接受的范围和文件总大小,一般格式如下:
Content-Range: bytes 0-499/22400
III: 状态码,206指服务器响应断点,200指服务器未响应断点
IV: Content-Length,服务器返回的数据的字节长度
二,一个支持断点续传的请求如下图:(Content-Length:27711597,即文件长度=27711597)
图1中,
Range:bytes=0-7
status:206
Content-Length:8
Content-Range:bytes 0-7/27711597
表示断点续传,服务器返回了从0-7的字节长度
图2中,
Range:bytes=27711590-27711597
status:206
Content-Length:7
Content-Range:bytes 27711590-27711596/27711597
表示断点续传,服务器返回了从27711590-27711596的字节长度
三,阿里云断点续传(Content-Length:69397,即文件长度=69397)
这里指的是通过一个阿里云的http地址,下载文件,而不是通过阿里云提供的sdk下载文件
图3中,
Range:bytes=0-7
status:206
Content-Length:8
Content-Range:bytes 0-7/69397
表示断点续传,服务器返回了从0-7的字节长度
图4中,
Range:bytes=69390-69397
status:200
Content-Length:69397
Content-Range:未返回
表示未断点续传,服务器返回了69397的字节长度,即文件的总长度
四,结论
问题1:阿里云图4请求,为什么请求头Range:bytes=69390-69397,响应的code=200,而不是206呢?
问题2:另一个支持断点的图2中,请求头Range:bytes=27711590-27711597,响应的code=206呢?
答1:阿里云官网说,请求头Range大于文件内容,则不按断点续传处理,直接返回200。
答2:另一个支持断点的图2中,可能是兼容性做的比较好,即使请求头Range大于文件内容,依然会返回后半部分数据。
最终结论:对于阿里云的这个文件,虽然文件的内容总长度是69397,我们却需要传Range:bytes=69390-69396(即结尾处是69397-1),或者传Range:bytes=69390-;(即只传开始,不传结束,这样也可以)