功能说明
在初始化分块上传后上传单个分块(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 int64ContentMD5 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 mainimport ("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"// 初始化分块上传,取得 UploadIDinitRes, _, err := c.Object.InitiateMultipartUpload(ctx, name, nil)if err != nil {log.Fatalf("InitiateMultipartUpload failed: %v", err)}uploadID := initRes.UploadID// 上传第 1 个分块,并记录 partNumber 与 ETagpartNumber := 1content := 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 重复上传时,后上传的分块会覆盖先前的分块。