断点下载实现

Posted pukaifei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了断点下载实现相关的知识,希望对你有一定的参考价值。

使用场景

OTA升级时,下载升级包做了断点下载

实现方式

  1. 在提供基础http接口的第三方网络通信库,基础上实现断点下载的逻辑
  2. 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最后的参数)
  • 单次连接超时时间
  • 总超时时间
  • 总尝试连接次数
  1. 查看是否存在要下载的文件(文件不存在,即第一次下载)
第一次下载时,可以不带Range,此时返回200,资源总长度在Content-Length字段。

第一次下载时,可以带Range:bytes=0-,返回206,资源总长度在Content-Range字段。

文件已存在,带Range:bytes请求
  1. 单次下载失败,重试,回到1
  2. 下载成功,作校验
  3. 超过下载设置的参数,认为下载失败

不使用ETag/Last-Modified时,可以使用response header中的校验字段作最后的检验。

参考资料

  1. http header https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/If-None-Match

以上是关于断点下载实现的主要内容,如果未能解决你的问题,请参考以下文章

Python实现下载界面(带进度条,断点续传,多线程多任务下载等)

JAVA下实现多线程断点下载

文件下载之断点续传(客户端与服务端的实现)

断点续传下载原理实现

Java 实现的断点下载

PHP实现文件下载断点续传详解