需求背景
- 动态创建的文件下载的时候希望浏览器显示下载进度
- 动态创建的文件希望能够分段下载
HTTP断点续传报文
要实现HTTP
断点续传必须要简单了解以下几个报文。
- Accept-Ranges 告诉客户端(浏览器..)服务器端支持断点续传
服务器端返回
- Range 客户端告诉服务器端从指定的的位置/范围(这里值字节数)下载资源
客户端发出
- Content-Range 服务器端告诉客户端响应的数据信息,在整个返回体中本部分的字节位置
服务器端返回
- ETag 资源标识
非必须
服务器端返回
- Last-Modified 资源最后一次更新的时间
非必须
服务器端返回
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
Content-Range
的数据格式
Content-Range: bytes 0-499/22036 :表示返回0-499字节范围数据 资源一共22036个字节
原理
- 客户端发起请求 设置
Range
指定开始字节数或结束字节数 如果是从0开始也可以不用设置。 - 服务器端检查到客户端
Range
头 解析开始字节数以及结束字节数 并返回报文头Accept-Ranges
表示支持断点续传,Content-Range
记录该次向客户端写入流的位置信息,然后再写入流到客户端。 - 服务端可以使用
ETag
Last-Modified
标记一下资源是否被修改。作一些验证工作,如果验证不通过则返回错误,非必须项。