HTTP 方式文件分片断点下载
前言
在进行大文件或网络带宽不是很好的情况下,分片断点下载就会显得很有必要,目前各大下载工具,如:迅雷等,都是很好的支持分片断点下载功能的。本文就通过http方式进行文件分片断点下载,进行实战说明。
HTTP之Range
在开始之前有必要了解一下相关概念及原理,即:HTTP之Range,才能更好的理解分片断点下载的原理。
什么是Range
Range是一个HTTP请求头,告知服务器要返回文件的哪一部分,即:哪个区间范围(字节)的数据,在 Range
中,可以一次性请求多个部分,服务器会以 multipart 文件的形式将其返回。如果服务器返回的是范围响应,需要使用 206
Partial Content
状态码。假如所请求的范围不合法,那么服务器会返回 416
Range Not Satisfiable
状态码,表示客户端错误。服务器允许忽略 Range
头,从而返回整个文件,状态码用 200
。
因为有了HTTP中Range请求头的存在,分片断点下载,便简单了许多。
当你正在看大片时,网络断了,你需要继续看的时候,文件服务器不支持断点的话,则你需要重新等待下载这个大片,才能继续观看。而Range支持的话,客户端就会记录了之前已经看过的视频文件范围,网络恢复之后,则向服务器发送读取剩余Range的请求,服务端只需要发送客户端请求的那部分内容,而不用整个视频文件发送回客户端,以此节省网络带宽。
Range规范
Range: <unit>=<range-start>-
Range: <unit>=<range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>
Range: <unit>=<range-start>-<range-end>, <range-start>-<range-end>, <range-start>-<range-end>
<unit>:范围所采用的单位,通常是字节(bytes)
<range-start>:一个整数,表示在特定单位下,范围的起始值
<range-end>:一个整数,表示在特定单位下,范围的结束值。这个值是可选的,如果不存在,表示此范围一直延伸到文档结束。
Range: bytes=1024-2048
分片断点下载之实现
以Java Spring Boot的方式来实现,核心代码如下:
serivce层
controller层
通过postman进行测试验证,启动Spring Boot后,如:下载文件前1024个字节的数据(Range:bytes=0-1023),如下:
注:此处 实现中没有提供客户端,客户端可循环调用本例中下载接口,每次调用指定实际的下载偏移区间range。
请注意响应头Accept-Ranges、Content-Range
Accept-Ranges: 表示响应标识支持范围请求,字段的具体值用于定义范围请求的单位,如:bytes。当发现Accept-Range 头时,可以尝试继续之前中断的下载,而不是重新开始。
Content-Range: 表示响应了多少数据,格式为:[要下载的开始位置]-[结束位置]/[文件总大小],如:bytes 0-1023/2185
源码:https://github.com/xcbeyond/common-utils/tree/master/src/main/java/com/xcbeyond/common/file/chunk
(如果你觉得不错,不妨留下脚步,在GitHub上给个Star)
参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Range
版权声明: 本文为 InfoQ 作者【xcbeyond】的原创文章。
原文链接:【http://xie.infoq.cn/article/b710d50fa4913f3ebcf894d2e】。文章转载请联系作者。
评论