标准接口
分段上传操作可以将超过5GB的大文件分割后上传,一共包含三个步骤:首先,发起分段上传请求获取一个upload id。然后,将大文件分割成片段后上传,除了最后一个片段,每个片段的数据大小为5MB~5GB,每个片段上传的时候附带upload id。最后,发送一个带有upload id的请求,完成或者中止分段上传操作。
代码示例:
func (p *S3Demo) multiPartsUploadObject() {
var key = "ExampleObject.txt"
createRes, err := p.svc.CreateMultipartUpload(&s3.CreateMultipartUploadInput{
Bucket: aws.String(p.bucket),
Key: aws.String(key),
})
if err != nil {
fmt.Println("err, ", err)
return
}
partNum := int64(1)
partRes, err := p.svc.UploadPart(&s3.UploadPartInput{
Bucket: aws.String(p.bucket),
Key: aws.String(key),
UploadId: createRes.UploadId,
PartNumber: &partNum,
Body: strings.NewReader("123"),
})
if err != nil {
fmt.Println("err, ", err)
return
}
parts := make([]*s3.CompletedPart, 0)
part := &s3.CompletedPart{
ETag: partRes.ETag,
PartNumber: &partNum,
}
parts = append(parts, part)
completeRes, err := p.svc.CompleteMultipartUpload(&s3.CompleteMultipartUploadInput{
Bucket: aws.String(p.bucket),
Key: aws.String(key),
MultipartUpload: &s3.CompletedMultipartUpload{Parts: parts},
UploadId: createRes.UploadId,
})
if err != nil {
fmt.Println("err, ", err)
return
}
fmt.Println("success multi parts upload,", completeRes)
out, err := p.svc.HeadObject(&s3.HeadObjectInput{
Bucket: aws.String(p.bucket),
Key: aws.String(key),
})
if err != nil {
fmt.Println("err, ", err)
return
}
fmt.Println("success head, ", out)
}
CreateMultipartUploadInput可设置的参数如下:
参数 | 类型 | 说明 | 是否必要 |
---|---|---|---|
ACL | *string | 配置上传对象的预定义的标准ACL信息,例如private,public-read,public-read-write等。 | 否 |
Bucket | *string | bucket的名称。 | 是 |
ContentType | *string | 描述上传文件格式的标准MIME类型 | 否 |
Key | *string | 上传文件到媒体存储服务后对应的key。 | 是 |
Metadata | map[string]*string | 对象的元数据信息。 | 否 |
Tagging | *string | 对象的标签信息,必须是URL请求参数的形式。例如,“Key1=Value1”。 | 否 |
CreateMultipartUploadOutput返回的属性如下:
参数 | 类型 | 说明 |
---|---|---|
AbortDate | *time.Time | 如果桶配置了管理未完成的上传分段的生命周期管理规则,并且该规则对本次分段上传生效,则AbortDate返回表示终止本次分段上传的时间。 |
AbortRuleId | *string | 当返回结果中包含AbortDate属性时,AbortRuleId表示使终止本次分段上传操作生效的生命周期管理规则的Id。 |
Bucket | *string | 执行分段上传的桶的名称。 |
Key | *string | 本次分段上传对象的名称。 |
RequestCharged | *string | 如果返回结果中包含该属性,表示请求的发起者对该次请求操作付费。 |
UploadId | *string | 本次分段上传操作Id。 |
UploadPartInput可设置的参数如下:
参数 | 类型 | 说明 | 是否必要 |
---|---|---|---|
Body | io.ReadSeeker | 对象的数据。 | 是 |
Bucket | *string | 执行分段上传的桶的名称。 | 是 |
ContentLength | *int64 | 说明请求body的长度(单位:字节),该参数可以在body长度不能被自动识别的情况下设置。 | 否 |
ContentMD5 | *string | base64编码的128位MD5值,不包含请求头部的信息 | 否 |
Key | *string | 上传文件到媒体存储服务后对应的key。 | 是 |
PartNumber | *int64 | 说明当前数据在文件中所属的片段,大于等于1,小于等于10000 | 是 |
UploadId | *string | 通过CreateMultipartUpload操作获取的UploadId,与一个分段上传的对象对应。 | 是 |
UploadPartOutput返回的属性如下:
参数 | 类型 | 说明 |
---|---|---|
ETag | *string | 本次上传片段后对应的Entity Tag |
RequestCharged | *string | 如果返回结果中包含该属性,表示该请求的发起者对该次请求操作付费。 |
CompleteMultipartUploadInput可设置的参数如下:
参数 | 类型 | 说明 | 是否必要 |
---|---|---|---|
Bucket | *string | 执行分段上传的桶的名称。 | 是 |
Key | *string | 上传文件到媒体存储服务后对应的key。 | 是 |
MultipartUpload | *CompletedMultipartUpload | 包含了每个已上传的片段的ETag和PartNUmber等信息 | 否 |
UploadId | *string | 通过CreateMultipartUpload操作获取的UploadId,与一个对象的分段上传对应。 | 是 |
CompleteMultipartUploadOutput返回的属性如下:
参数 | 类型 | 说明 |
---|---|---|
Bucket | *string | 执行分段上传的桶的名称。 |
ETag | *string | 本次上传对象后对应的Entity Tag |
Key | *string | 上传文件到媒体存储服务后对应的key。 |
Location | *string | 上传对象后对应的URI。 |
RequestCharged | *string | 如果返回结果中包含该属性,表示该请求的发起者对该次请求操作付费。 |
VersionId | *string | 上传对象后相应的版本ID。 |