跳转至

断点续传

上传

数据分片,每次上传时指定传输的范围,上传时,由前后端控制,基本都需要定制。

下载

HTTP1.1协议(RFC2616)中定义了断点续传相关的HTTP头 RangeContent-Range字段,一个最简单的断点续传实现大概如下:

  1. 客户端下载一个1024K(K=1000)的文件,已经下载了其中512K

  2. 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:Range:bytes=512000-,这个头通知服务端从文件的512K位置开始传输文件;

  3. 服务端收到断点续传请求,根据请求头的Content-Range来决定从文件流的哪个位置上开始读,比如从文件的512K位置开始传输,并且在HTTP头中增加:Content-Range:bytes 512000-/1024000,并且此时服务端返回的HTTP状态码应该是206,而不是200。

假如所请求的范围不合法,那么服务器会返回416 Range Not Satisfiable状态码,表示客户端错误。

服务器允许忽略 Range 首部,从而返回整个文件,状态码用200

问题1:续传时下载的文件发生变化?

在终端发起续传请求时,URL对应的文件内容在服务端已经发生变化,此时续传的数据肯定是错误的。

需要有一个标识文件唯一性的方法:RFC2616中相关定义

  • Last-Modified 来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。
  • ETag的头域字段,可以使用 ETag 头来放置文件的唯一标识,比如文件的MD5值。
  • 续传时客户端使用If-Range,内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时间。
  • 服务端在收到续传请求时,通过If-Range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。