文档中心 > 分片下载
分片下载

最近更新时间:2022-07-25

当下载大文件时,如果网络不稳定或者程序异常退出,会导致下载失败,甚至重试多次仍无法完成下载。为此UOS提供了分片下载功能。

断点下载时需要使用到 Range 和 Content-Range 实体头。

  • Range用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:

    Range:(unit=first byte pos)-[last byte pos]

  • Content-Range用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:

    Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth]

分片下载需要将文件分成多个部分,通过range头将文件分成多个部分,通过分别对多部分文件进行下载,如果再某部分下载失败,通过设置range头的下载范围,将对下载失败的部分进行重新下载。

func MultiPartDownloadSample() {
DeleteTestBucketAndObject()
defer DeleteTestBucketAndObject()
sc := s3lib.NewS3(endpoint, accessKey, secretKey)
// Create a bucket
err := sc.MakeBucket(bucketName)
if err != nil {
HandleError(err)
}

// Put a 5kib file
RANGE:=make([]byte, 5<<10)
err = sc.PutObject(bucketName, objectKey, bytes.NewReader(RANGE))
if err != nil {
HandleError(err)
}
//Slice download by range
   ranges:=map[string]string{"0":"1000","1001":"2000","2001":"3000","3001":"4000","4001":"5119"}
for range1,range2:=range ranges{
out, err := sc.GetObjectWithRange(bucketName, objectKey,"bytes="+range1+"-"+range2)
if err != nil {
HandleError(err)
}
fmt.Println("Download range is :",out)

}
fmt.Printf("MultiPartDownloadSample Run Success !\n\n")
}