功能说明
完成整个分块上传(Complete Multipart Upload)。当所有分块上传完毕后,需按分块编号升序提交每个分块的
PartNumber 与 ETag,服务端据此将分块合并为完整对象。对高性能桶发起请求时,SDK 通过 RapidCredentialTransport 自动完成会话鉴权。方法原型
func (s *ObjectService) CompleteMultipartUpload(ctx context.Context, name, uploadID string, opt *CompleteMultipartUploadOptions) (*CompleteMultipartUploadResult, *Response, error)
参数说明
type CompleteMultipartUploadOptions struct {Parts []Object}type Object struct {PartNumber intETag string}
参数名称 | 参数描述 | 类型 | 是否必选 |
ctx | 请求上下文,用于控制超时与取消 | context.Context | 是 |
name | 对象键(Object Key) | string | 是 |
uploadID | 初始化分块上传返回的 UploadID | string | 是 |
opt | 完成选项,包含分块列表 | *CompleteMultipartUploadOptions | 是 |
Parts | 待合并的分块列表,每项需包含 PartNumber 与 ETag,且按 PartNumber 升序排列 | []Object | 是 |
返回结果说明
type CompleteMultipartUploadResult struct {Location stringBucket stringKey stringETag string}
参数名称 | 参数描述 | 类型 |
Location | 合并后对象的访问地址 | string |
Bucket | 对象所在的桶名 | string |
Key | 对象键 | string |
ETag | 合并后对象的 ETag | string |
使用案例
package mainimport ("context""log""net/http""net/url""os""strings""time""github.com/tencentyun/cos-go-sdk-v5")func main() {u, _ := url.Parse("https://examplebucket-x--1250000000.cosrapid.ap-guangzhou.myqcloud.com")b := &cos.BaseURL{BucketURL: u}base := &cos.AuthorizationTransport{SecretID: os.Getenv("SECRETID"),SecretKey: os.Getenv("SECRETKEY"),}c := cos.NewClient(b, &http.Client{Transport: cos.NewRapidCredentialTransport(base),Timeout: 30 * time.Second,})ctx := context.Background()name := "exampleobject.txt"// 初始化分块上传initRes, _, err := c.Object.InitiateMultipartUpload(ctx, name, nil)if err != nil {log.Fatalf("InitiateMultipartUpload failed: %v", err)}uploadID := initRes.UploadID// 上传分块,记录每块的 PartNumber 与 ETagvar parts []cos.ObjectpartNumber := 1resp, err := c.Object.UploadPart(ctx, name, uploadID, partNumber,strings.NewReader("this is the content of part 1"), nil)if err != nil {log.Fatalf("UploadPart failed: %v", err)}parts = append(parts, cos.Object{PartNumber: partNumber,ETag: resp.Header.Get("ETag"),})// 按 PartNumber 升序提交完成opt := &cos.CompleteMultipartUploadOptions{Parts: parts}res, _, err := c.Object.CompleteMultipartUpload(ctx, name, uploadID, opt)if err != nil {log.Fatalf("CompleteMultipartUpload failed: %v", err)}log.Printf("complete OK, Location: %s, ETag: %s\\n", res.Location, res.ETag)}
注意事项
Parts 必须按 PartNumber 升序排列,否则会返回 InvalidPartOrder;分块编号不连续会返回 InvalidPart。完成分块上传即使返回 200,响应体中仍可能内嵌错误(例如合并阶段出错),SDK 在返回结果的
ETag 为空时会将其视为失败并返回 error,务必检查返回的 error。除最后一块外,分块小于 1MB 会返回
EntityTooSmall;uploadID 不存在会返回 NoSuchUpload。