何为断点续传?
如果你下载一个超大的文件到99%,突然没网了,你急不急?
断点续传就是为解决这个问题运用而生
断点续传-上传
需要在前端手动切割文件,一块一块上传,最后再让后端组合文件。
目前主流框架没有实现,需要手写实现
断点续传-下载
请求一个文件下载,如果http响应中有一个Accept-Ranges: bytes
这就代表服务端支持断点续传,其实nginx,apache等web服务器默认是开始支持断点续传的可以用curl --range 0-100 的命令表示下载0-100 这101字节的内容
1 | Ranges: bytes=4000- // 下载从第4000字节开始到文件结束部分 |
http请求头中只要携带range:bytes=M-N
range:bytes=M-
range:bytes=-N
服务端就会返回http_code码为206(即使返回的是全部的数据)
并且响应头多一个Content-Range:bytes ${start}-/${end}/${total}
字段,表示本次下载范围
- 经钻研,只要是网页标签发起的是媒体请求(音频,视频),默认都会携带
range:bytes=0-
请求头。
service worker线程,主动抓取的不会携带,拦截的依旧会携带(非200的响应码无法放入cache缓存中)
(主动抓取:通过事件消息的方式从而主动触发请求资源,而不是靠fetch拦截事件去请求资源)
nginx断点续传模块
nginx断点续传的功能主要由ngx_http_range_filter_module
模块实现
该模块包括
- ngx_http_range_header_filter_module
设置Content-Range响应头: 指定区块的起始值
设置Content-Length响应包大小
设置code码为206 - ngx_http_range_body_filter_module
根据range请求区间位置,从缓存区读取文件并发送给客户端
等两个模块组成
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 老曹的私房站!
评论