断点下载实现
Posted pukaifei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了断点下载实现相关的知识,希望对你有一定的参考价值。
使用场景
OTA升级时,下载升级包做了断点下载
实现方式
- 在提供基础http接口的第三方网络通信库,基础上实现断点下载的逻辑
- curl库携带了断点续传的功能
http相关
request
Range:告诉服务端从指定位置下载
一个1000字节的资源,Range可以设置为0~999,0表示第一字节
Range 的范围格式
表示0-499个字节范围:Range: bytes=0-499
表示最后500个字节范围:Range: bytes=-500
表示500字节开始到结束范围:Range: bytes=500-
表示第一个和最后一个字节:Range: bytes=0-0,-1
表示同时指定几个范围:Range: bytes=500-600,601-999
If-Unmodified-Since: (非必须)携带上一次请求时,服务端返回的Last-Modified,如果有更新,则返回412
If-None-Match: (非必须)携带上一次请求时,服务端返回的ETag,如果不一致,返回304
response
code
code 206: 表示partial content
code 416: 表示请求范围错误,比如1000字节的资源,Range:bytes=1000-,则返回416
Accept-Ranges: 是否支持断点
Accept-Ranges: bytes (支持)
Accept-Ranges: none (不支持)
Content-Range: bytes 100-200/5000 body中是100-200的内容,资源总长度5000
ETag: (非必须)资源标识,用于同一位置的资源有更新时,断点下载时携带上次的Etag,服务端作比对
Last-Modified:(非必须) 资源最后一次更新的时间,作用同ETag
断点下载实现
参数:
- url
- 文件保存位置
- 文件名(可以选择url最后的参数)
- 单次连接超时时间
- 总超时时间
- 总尝试连接次数
- 查看是否存在要下载的文件(文件不存在,即第一次下载)
第一次下载时,可以不带Range,此时返回200,资源总长度在Content-Length字段。
第一次下载时,可以带Range:bytes=0-,返回206,资源总长度在Content-Range字段。
文件已存在,带Range:bytes请求
- 单次下载失败,重试,回到1
- 下载成功,作校验
- 超过下载设置的参数,认为下载失败
不使用ETag/Last-Modified时,可以使用response header中的校验字段作最后的检验。
参考资料
以上是关于断点下载实现的主要内容,如果未能解决你的问题,请参考以下文章