上传对象
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需要使用分片上传。