获取对象
- GetObject
GetObject操作可以获取对象数据,并且保存为本地文件。执行GetObject操作必须对目标Object具有READ权限。
代码示例:
// 下载object到本地
func GetObject(svc *s3.S3) {
getObjectInput := &s3.GetObjectInput{
Bucket: aws.String("exampleBucket"),
Key: aws.String("exampleKey"),
}
getObjectOutput, err := svc.GetObject(getObjectInput)
if err != nil {
fmt.Printf("Failed to get object. %v\n", err)
return
}
defer func() {
err := getObjectOutput.Body.Close()
if err != nil {
fmt.Printf("fail to close result body. %v\n", err)
}
}()
fmt.Println(getObjectOutput)
// 将对象保存为本地文件
p := make([]byte, 1024)
filepath := "localPath"
file, err := os.Create(filepath)
if err != nil {
fmt.Println("fail to create file.", err)
return
}
defer func() {
err := file.Close()
if err != nil {
fmt.Printf("fail to close file. %v\n", err)
}
}()
for {
readCount, readErr := getObjectOutput.Body.Read(p)
_, _ = file.Write(p[:readCount])
if readErr != nil {
break
}
}
}
GetObjectInput可设置的参数如下:
参数 | 类型 | 说明 | 是否必要 |
---|---|---|---|
Bucket | *string | 执行本操作的桶名称。 | 是 |
IfMatch | *string | 用于指定只有在对象的ETag和该参数值匹配的情况下才返回对象数据,否则返回412错误码。 | 否 |
IfModifiedSince | *time.Time | 用于只有当对象在指定时间后被修改的情况下才返回该对象,否则返回304错误码。 | 否 |
IfNoneMatch | *string | 用于指定只有在对象的ETag和该参数值不匹配的情况下才返回对象数据,否则返回304错误码 | 否 |
IfUnmodifiedSince | *time.Time | 用于仅当对象自指定时间以来未被修改的情况下才返回对象数据,否则返回412错误码。 | 否 |
Key | *string | 对象的key。 | 是 |
PartNumber | *int64 | 读取对象指定的片段,该参数大于等于1,小于等于10000。 | 否 |
Range | *string | 下载对象指定范围内的数据(单位:字节),必须是"bytes=first-last"的格式,例如"bytes=0-9"表示前10字节的数据,详情请参见详情请参见RFC2616。 | 否 |
ResponseCacheControl | *string | 用于设置response的Cache-Control头部字段信息。 | 否 |
ResponseContentDisposition | *string | 用于设置response的Content-Disposition头部字段信息。 | 否 |
ResponseContentEncoding | *string | 用于设置response的Content-Encoding头部字段信息。 | 否 |
ResponseContentLanguage | *string | 用于设置response的Content-Language头部字段信息。 | 否 |
ResponseContentType | *string | 用于设置response的Content-Type头部字段信息。 | 否 |
ResponseExpires | *time.Time | 用于设置response的Expires头部字段信息。 | 否 |
VersionId | *string | 当bucket开启版本控制的时候,用于指定获取指定版本的对象数据,当不指定该参数的时候,默认获取最新版本的对象数据。 | 否 |
GetObjectOutput返回的属性如下:
参数 | 类型 | 说明 |
---|---|---|
Body | io.ReadCloser | 对象的数据。 |
ContentLength | *int64 | 对象数据的长度,单位为字节。 |
ContentType | *string | 数据的标准MIME类型。 |
ETag | *string | 对象的Entity Tag。 |
LastModified | *time.Time | 最后修改对象的时间。 |
TagCount | *int64 | 对象标签的数量。 |
VersionId | *string | 对象的版本ID。 |
- GetObjectRequest
GetObjectRequest操作首先生成一个"request.Request"对象,该对象是一个执行GetObject操作的请求。通过调用Request对象的Send方法完成上传对象的操作。该方法可以生成定制化的请求,例如自定义请求头部请求超时重试设置。
代码示例:
func GetObjectRequest(svc *s3.S3) {
input := &s3.GetObjectInput{
Bucket: aws.String("exampleBucket"),
Key: aws.String("exampleKey"),
}
req, resp := svc.GetObjectRequest(input)
err := req.Send()
if err != nil {
fmt.Printf("fail to get object. %v\n", err)
return
}
// 将对象保存为本地文件
p := make([]byte, 1024)
filePath := "localPath"
file, err := os.Create(filePath)
if err != nil {
fmt.Println("fail to create file.", err)
return
}
defer func() {
err := file.Close()
if err != nil {
fmt.Printf("fail to close file. %v\n", err)
}
}()
for {
readCount, readErr := resp.Body.Read(p)
_, _ = file.Write(p[:readCount])
if readErr != nil {
break
}
}
}
- downloader下载对象。
代码示例:
// 下载对象到本地
func DownloadObject(sess *session.Session) {
filePath := "filePath"
file, err := os.Create(filePath)
if err != nil {
fmt.Println("fail to create file.", err)
return
}
defer func() {
err := file.Close()
if err != nil {
fmt.Printf("fail to close file. %v\n", err)
}
}()
downloader := s3manager.NewDownloader(sess)
_, err = downloader.Download(file,
&s3.GetObjectInput{
Bucket: aws.String("exampleBucket"),
Key: aws.String("exampleKey"),
})
if err != nil {
fmt.Printf("fail to download file. %v\n", err)
return
}
}
响应结果:
HTTP状态 | 响应码 | 描述 |
---|---|---|
200 | Success | 操作成功。 |
304 | NotModified | GetObjectInput中设置的IfNoneMatch或IfModifiedSince参数与下载对象的属性不匹配。 |
403 | AccessDenied | 用户没有权限执行操作。 |
404 | NoSuchBucket | 操作指定的桶不存在。 |
404 | NoSuchKey | 操作指定的对象不存在。 |
412 | PreconditionFailed | GetObjectInput中设置的IfMatch或IfUnmodifiedSince参数与下载对象的属性不匹配。 |
416 | InvalidRange | Range指定的范围不合法。 |