帮你快速理解、总结文档立即下载

上传分块

最近更新时间:2026-10-21 18:34:05
我的收藏

功能说明

在初始化分块上传后上传单个分块(Upload Part)。每个分块由 partNumber 标识(从 1 开始,支持乱序上传),上传成功后需从响应头读取该块的 ETag,并将 partNumber 与 ETag 记录下来,供后续 完成分块上传 使用。对高性能桶发起请求时,SDK 通过 RapidCredentialTransport 自动完成会话鉴权。

方法原型

func (s *ObjectService) UploadPart(ctx context.Context, name, uploadID string, partNumber int, r io.Reader, opt *ObjectUploadPartOptions) (*Response, error)

参数说明

type ObjectUploadPartOptions struct {
ContentLength int64
ContentMD5 string
}
参数名称
参数描述
类型
是否必选
ctx
请求上下文,用于控制超时与取消
context.Context
是
name
对象键(Object Key)
string
是
uploadID
初始化分块上传返回的 UploadID
string
是
partNumber
分块编号,从 1 开始,支持乱序上传
int
是
r
待上传分块的内容
io.Reader
是
opt
上传选项,可为 nil
*ObjectUploadPartOptions
否
ContentLength
分块内容长度。当 r 不是 bytes.Buffer/bytes.Reader/strings.Reader 时必须指定
int64
否
ContentMD5
分块内容的 MD5 校验值(Base64 编码),用于完整性校验
string
否

返回结果说明

参数名称
参数描述
类型
*Response
响应对象,需从中读取该块的 ETag:resp.Header.Get("ETag")
*cos.Response
error
错误信息,成功时为 nil
error

使用案例

package main

import (
"context"
"fmt"
"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"

// 初始化分块上传,取得 UploadID
initRes, _, err := c.Object.InitiateMultipartUpload(ctx, name, nil)
if err != nil {
log.Fatalf("InitiateMultipartUpload failed: %v", err)
}
uploadID := initRes.UploadID

// 上传第 1 个分块,并记录 partNumber 与 ETag
partNumber := 1
content := strings.NewReader("this is the content of part 1")
resp, err := c.Object.UploadPart(ctx, name, uploadID, partNumber, content, nil)
if err != nil {
log.Fatalf("UploadPart failed: %v", err)
}
etag := resp.Header.Get("ETag")
fmt.Printf("part %d uploaded, ETag: %s\\n", partNumber, etag)
}

注意事项

上传成功后必须从 resp.Header.Get("ETag") 读取分块 ETag,并连同 partNumber 一起记录,完成分块上传 时需按此校验。
除最后一块外,每个分块建议不小于 1MB;分块过小在完成上传时可能返回 EntityTooSmall。
当 r 不是 bytes.Buffer/bytes.Reader/strings.Reader 时(例如自定义 Reader),必须通过 opt.ContentLength 显式指定分块长度。
相同 uploadID 与 partNumber 重复上传时,后上传的分块会覆盖先前的分块。
错误处理方式请参见 异常处理。