goroutine&waitgroup 下载文件
0.1、索引
https://blog.waterflow.link/articles/1663078266267
当我们下载一个大文件的时候,会因为下载时间太久而超时或者出错。那么我么我们可以利用 goroutine 的特性并发分段的去请求下载资源。
1、Accept-Ranges
首先下载链接需要在响应中返回 Accept-Ranges,并且它的值不为 “none”,那么该服务器支持范围请求。比如我们可以利用 HEAD 请求来进行检测
我们可以使用curl
命令看下 head 头
其中,Accept-Ranges: bytes
表示界定范围的单位是 bytes 。这里 Content-Length 也是有效信息,因为它提供了文件的完整大小。
2、Range
假如服务器支持范围请求的话,你可以使用 Range 首部来生成该类请求。该首部指示服务器应该返回文件的哪一或哪几部分。
单一范围
我们可以请求资源的某一部分。这次我们依然用 cURL 来进行测试。"-H" 选项可以在请求中追加一个首部行,在这个例子中,是用 Range 首部来请求图片文件的前 1024 个字节。
Content-Range 表示请求的资源在整个资源中的位置,这个时候 Content-Length 就不是表示整个资源的大小,而是请求资源的大小。
多重范围
我们也可以请求多个范围,只需要在 Range 中指定多个即可
服务器返回 206 Partial Content 状态码和 Content-Type:multipart/byteranges; boundary=3d6b6a416f9b5 头部,Content-Type:multipart/byteranges 表示这个响应有多个 byterange。每一部分 byterange 都有他自己的 Content-type 头部和 Content-Range,并且使用 boundary 参数对 body 进行划分。
3、goroutine
我们代码中通过获取 Contetn-Length 总大小,和 spPart 分成了 3 部分,通过 goroutine 进行并行的单一范围请求。然后把最终请求的结果保存在临时文件。之后再把这 3 部分内容统一保存到最终的文件中
具体代码如下:
评论