当下载大文件时,如果网络不稳定或者程序异常退出,会导致下载失败,甚至重试多次仍无法完成下载。为此OSS提供了断点续传下载功能。
断点续传下载将需要下载的文件分成若干个分片分别下载,所有分片都下载完成后,将所有分片合并成完整的文件。
在下载的过程中会在checkpoint文件中记录当前下载的进度信息,如果下载过程中某一分片下载失败,再次下载时会从checkpoint文件中记录的点继续下载,从而达到断点续传下载的效果。下载完成后,checkpoint文件会被删除。
说明
- SDK会将下载的中间状态信息记录在Checkpoint文件中,所以要确保程序对Checkpoint文件有写权限。Checkpoint携带了校验信息,请不要修改。如果Checkpoint文件损坏则会重新下载文件。
- 如果下载过程中待下载的OSS文件发生了改变(ETag改变),或者part文件丢失或被修改,则会重新下载文件。
您可以使用Bucket.DownloadFile
实现断点续传下载。可设置的参数如下:
参数 | 说明 |
---|---|
objectKey | 要下载的OSS文件名称。 |
filePath | 下载到本地文件的路径。 |
partSize | 下载分片大小,取值范围为1B~5GB。 |
options | 可选项,包括:
|
以下代码用于断点续传下载:
package main import ( "fmt" "os" "github.com/aliyun/aliyun-oss-go-sdk/oss" ) func main() { // 创建OSSClient实例。 client, err := oss.New("<yourEndpoint>", "<yourAccessKeyId>", "<yourAccessKeySecret>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 获取存储空间。 bucket, err := client.Bucket("<yourBucketName>") if err != nil { fmt.Println("Error:", err) os.Exit(-1) } // 分片下载。3个协程并发下载分片,开启断点续传下载。 // 其中"<yourObjectName>"为objectKey,表示从OSS断点下载文件到时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。 // "LocalFile"为filePath,100*1024为partSize。 err = bucket.DownloadFile("<yourObjectName>", "LocalFile", 100*1024, oss.Routines(3), oss.Checkpoint(true, "")) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } }