获取对象

  • 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指定的范围不合法。