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

How to check s3 object size using golang

我已经实现了从 AWS S3 存储桶下载对象的功能。这很好用。但是我需要显示一个下载进度条。为此,我需要根据 here 事先知道对象的大小 .有谁知道如何获取对象大小?

这是我的代码。

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")
}

您可以使用 HeadObject, which contains the header Content-Length

HeadObject API operation for Amazon Simple Storage Service.

The HEAD operation retrieves metadata from an object without returning the object itself. This operation is useful if you're only interested in an object's metadata. To use HEAD, you must have READ access to the object.

这应该有效:

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)