上传对象

PutObject操作用于上传对象。如果对同一个对象同时发起多个上传请求,最后一次完成的请求将覆盖之前所有请求的上传的对象。可以通过设置请求头部中的Content-MD5字段来保证数据被完整上传,如果上传的数据不能通过MD5校验,该操作将返回一个错误提示。用户可以通过比较上传对象后获得的ETag 与原文件的MD5值是否相等来确认上传操作是否成功。

上传对象操作在上传对象时可以在请求里携带HTTP协议规定的6个请求头:Cache-Control、Expires、Content-Encoding、Content-Disposition、Content-Type、Content-Language。如果上传对象的请求设置了这些请求头,服务端会直接将这些头域的值保存下来。这6个值也可以通过修改对象元数据操作进行修改。在该对象被下载或者执行HeadObject操作的时候,这些保存的值将会被设置到对应的HTTP头域中返回客户端。

PutObject操作可以上传最大不超过5GB的文件,超过5GB的文件可以通过分段上传操作上传到媒体存储服务,对象key的命名使用UTF-8编码,长度必须在1~1023字节之间,不能反斜线(\)开头。

代码示例:

// 上传文件
func PutObject(svc *s3.S3) {
    bucket := "exampleBucket"
    key := "exampleKey"
    filePath := "exampleFile"
    file, err := os.Open(filePath)
    if err != nil {
        fmt.Printf("Unable to open file:%v", err)
        os.Exit(1)
    }
    defer func() {
        err := file.Close()
        if err != nil {
            fmt.Printf("fail to close file. %v\n", err)
        }
    }()

    putObjectInput := &s3.PutObjectInput{
        Body:   file,
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    }
    putObjectOutput, err := svc.PutObject(putObjectInput)
    if err != nil {
        fmt.Printf("Failed to put object %q, %v", key, err)
    } else {
        fmt.Println(putObjectOutput)
    }
}

PutObjectInput可设置的参数如下:

参数 类型 说明 是否必要
ACL *string 配置上传对象的预定义的标准ACL信息,例如private,public-read,public-read-write等。
Body io.ReadSeeker 对象的数据。
Bucket *string 执行本操作的桶名称。
Key *string 上传文件到媒体存储服务后对应的key。PutObject操作支持将文件上传至文件夹,如需要将对象上传至"/folder"文件下,只需要设置Key="/folder/{exampleKey}“即可。
Metadata map[string]*string 对象的元数据信息。
Tagging *string 对象的标签信息,必须是URL请求参数的形式。例如,“Key1=Value1”。

PutObjectOutput返回的属性如下:

参数 类型 说明
ETag *string 上传对象后对应的Entity Tag
VersionId *string 上传对象后相应的版本Id。

响应结果:

HTTP状态 响应码 描述
200 Success 操作成功。
400 EntityTooLarge 上传的文件太大。
400 InvalidDigest 请求中设置的ContentMD5的值与OSS接收到文件的MD5值不符。
400 InvalidObjectName 对象的名字不合法
403 AccessDenied 用户没有权限执行操作。
404 NoSuchBucket 操作指定的桶不存在。

注意:putObject对文件大小有限制,最大能上传1GB大小的文件,超过1GB需要使用分片上传。