如何使用golang检查s3对象的大小

5
我已经实现了一个从AWS S3存储桶下载对象的函数,它可以正常工作。但是我需要显示一个下载进度条。为此,我需要事先知道对象的大小,根据这里,才能进行操作。有人知道如何获取对象的大小吗?
以下是我的代码:
func DownloadFromS3Bucket(bucket, item, path string) {
    file, err := os.Create(filepath.Join(path, item))
    if err != nil {
        fmt.Printf("Error in downloading from file: %v \n", err)
        os.Exit(1)
    }

    defer file.Close()

    sess, _ := session.NewSession(&aws.Config{
        Region: aws.String(constants.AWS_REGION), Credentials: credentials.AnonymousCredentials},
    )

    // Create a downloader with the session and custom options
    downloader := s3manager.NewDownloader(sess, func(d *s3manager.Downloader) {
        d.PartSize = 64 * 1024 * 1024 // 64MB per part
        d.Concurrency = 6
    })

    numBytes, err := downloader.Download(file,
        &s3.GetObjectInput{
            Bucket: aws.String(bucket),
            Key:    aws.String(item),
        })
    if err != nil {
        fmt.Printf("Error in downloading from file: %v \n", err)
        os.Exit(1)
    }

    fmt.Println("Download completed", file.Name(), numBytes, "bytes")
}
3个回答

7
你可以使用HeadObject,其中包含头信息 Content-Length

HeadObject API操作适用于Amazon Simple Storage Service。

HEAD操作从对象中检索元数据,而不返回对象本身。如果您仅对对象的元数据感兴趣,则此操作非常有用。要使用HEAD,您必须具有对对象的读取权限。


请问您能否用Go语言举个例子?我找不到任何Go语言的实现。 - Madhuka Wickramapala
1
@MadhukaWickramapala 这里有一个例子,请查看链接,尝试发送请求并打印响应。 - Nik

5

这样应该可以运行:

headObj := s3.HeadObjectInput{
    Bucket: aws.String(bucket),
    Key: aws.String(key),
}
result, err := S3.HeadObject(&headObj)
if err != nil {
  // handle error
}
return aws.Int64Value(result.ContentLength)

完美但是return不起作用,所以更容易只使用fmt.Println,例如: fmt.Println(result) - Uber Sholder

0
使用aws-sdk-go-v2,您可以在GetObjectResponse中获得内容长度。此代码片段适用于v1标签之前的aws-sdk-go-v2版本。
// s3client is *s3.Client
// s3 qualifier is "github.com/aws/aws-sdk-go-v2/service/s3"

req := s3client.GetObjectRequest(&s3.GetObjectInput{
    Bucket: aws.String(bucket),
    Key:    aws.String(key),
})
resp, err := req.Send(ctx)
if err != nil {
    return nil, err
}
body := resp.Body // the io.ReadCloser that streams the object data
clen := aws.Int64Value(resp.ContentLength) // the content length

自从aws-sdk-go-v2 v1版本以来,方法是GetObject,响应是GetObjectOutput,但仍然具有ContentLength字段。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接