标准接口

分段上传操作可以将超过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。