详细解答可以参考官方帮助文档
当上传大文件时,如果网络不稳定或者程序崩溃了,则整个上传就失败了。用户
不得不重头再来,这样做不仅浪费资源,在网络不稳定的情况下,往往重试多次
还是无法完成上传。
通过Bucket.UploadFile
接口来实现断点续传上传。它有以下参数:
file.cp
,其中file
是本地文件的名字上传时指定元信息
其实现的原理是将要上传的文件分成若干个分片分别上传,最后所有分片都上传 成功后,完成整个文件的上传。在上传的过程中会记录当前上传的进度信息(记 录在checkpoint文件中),如果上传过程中某一分片上传失败,再次上传时会从 checkpoint文件中记录的点继续上传。这要求再次调用时要指定与上次相同的 checkpoint文件。上传完成后,checkpoint文件会被删除。
提示:
- 分片上传的示例代码在
sample/put_object.go
。
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
// 分片大小100K,3个协程并发上传分片,使用断点续传
err = bucket.UploadFile("my-object", "LocalFile", 100*1024, oss.Routines(3), oss.Checkpoint(true, ""))
if err != nil {
// HandleError(err)
}
注意:
- SDK会将上传的中间状态信息记录在cp文件中,所以要确保用户对cp文件有写权限
- cpt文件记录了上传的中间状态信息并自带了校验,用户不能去编辑它,如 果cpt文件损坏则重新上传所有分片。整个上传完成后cpt文件会被删除。
- 如果上传过程中本地文件发生了改变,则重新上传所有分片
提示:
- 指定断点续传checkpoint文件路径使用
oss.Checkpoint(true, "your-cp-file.cp")
- 使用
bucket.UploadFile(objectKey, localFile, 100*1024)
,默认不使用分片并发上传、不启动断点续传
您可以用Bucket.ListUploadedParts获取某个分片上传已上传的分片。
import "fmt"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
imur, err := bucket.InitiateMultipartUpload("my-object")
if err != nil {
// HandleError(err)
}
lsRes, err := bucket.ListUploadedParts(imur)
if err != nil {
// HandleError(err)
}
fmt.Println("Parts:", lsRes.UploadedParts)
通过Bucket.ListMultipartUploads
来列出当前分片上传任务。主要的参数如下:
参数 | 说明 |
---|---|
Delimiter | 用于对Object名字进行分组的字符。所有名字包含指定的前缀且第一次出现delimiter字符之间的object作为一组元素。 |
MaxUploads | 限定此次返回Multipart Uploads事件的最大数目,默认为1000,max-uploads取值不能大于1000。 |
KeyMarker | 所有Object名字的字典序大于KeyMarker参数值的Multipart事件。 |
Prefix | 限定返回的文件名(object)必须以Prefix作为前缀。注意使用Prefix查询时,返回的文件名(Object)中仍会包含Prefix。 |
import "fmt"
import "github.com/aliyun/aliyun-oss-go-sdk/oss"
client, err := oss.New("Endpoint", "AccessKeyId", "AccessKeySecret")
if err != nil {
// HandleError(err)
}
bucket, err := client.Bucket("my-bucket")
if err != nil {
// HandleError(err)
}
lsRes, err := bucket.ListMultipartUploads()
if err != nil {
// HandleError(err)
}
fmt.Println("Uploads:", lsRes.Uploads)
lsRes, err := bucket.ListMultipartUploads(oss.Prefix("my-object-"))
if err != nil {
// HandleError(err)
}
fmt.Println("Uploads:", lsRes.Uploads)
lsRes, err := bucket.ListMultipartUploads(oss.MaxUploads(100))
if err != nil {
// HandleError(err)
}
fmt.Println("Uploads:", lsRes.Uploads)
lsRes, err := bucket.ListMultipartUploads(oss.Prefix("my-object-"), oss.MaxUploads(100))
if err != nil {
// HandleError(err)
}
fmt.Println("Uploads:", lsRes.Uploads)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。