当下载大文件时,如果网络不稳定或者程序异常退出,会导致下载失败,甚至重试多次仍无法完成下载。为此,OSS提供了断点续传下载功能。断点续传下载将需要下载的文件分成若干个分片分别下载,所有分片都下载完成后,将所有分片合并成完整的文件。
注意事项
- 使用断点续传下载时,文件下载的进度信息会记录在Checkpoint文件中,如果下载过程中某一分片下载失败,再次下载时会从Checkpoint文件中记录的点继续下载,从而达到断点续传的效果。下载完成后,Checkpoint文件会被删除。
- SDK会将下载的状态信息记录在Checkpoint文件中,所以要确保程序对Checkpoint文件有写权限。
- 请勿修改Checkpoint文件中携带的校验信息。如果Checkpoint文件损坏,则会重新下载所有分片。
- 如果下载过程中文件的ETag发生变化、Part丢失或被修改,则重新下载文件。
示例代码
package main
import (
"fmt"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
client, err := oss.New("yourEndpoint", "yourAccessKeyId", "yourAccessKeySecret")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 填写Bucket名称,例如examplebucket。
bucket, err := client.Bucket("examplebucket")
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// yourObjectName填写Object完整路径,完整路径中不能包含Bucket名称,例如exampledir/exampleobject.txt。
// yourLocalFile填写本地文件的完整路径,例如D:\\localpath\\examplefile.txt。如果未指定本地路径,则下载后的文件默认保存到示例程序所属项目对应本地路径中。
// 设置分片大小为100 KB(100*1024),并指定分片下载并发数为3。
// oss.Checkpoint(true, "")表示开启断点续传下载功能,并且Checkpoint文件为与本地文件同目录下的file.cp,其中file是本地文件名称。您也可以使用oss.Checkpoint(true, "your-cp-file.cp")指定Checkpoint文件。
err = bucket.DownloadFile("exampledir/exampleobject.txt", "D:\\localpath\\examplefile.txt", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
}