【问题标题】:Get the size of a folder in Amazon S3 using Go SDK 2使用 Go SDK 2 获取 Amazon S3 中文件夹的大小
【发布时间】:2021-11-13 09:38:23
【问题描述】:

我知道 Amazon S3 中没有文件夹,但我们可以通过在键名上使用“/”来模拟它们。 鉴于此,是否可以使用AWS SDK for Go v2 来计算文件夹的大小?还是我必须检索文件夹中的所有对象,然后一一计算大小?

【问题讨论】:

  • 列出对象包括每个对象的大小。你可以对结果求和。

标签: amazon-web-services go amazon-s3


【解决方案1】:

给定that example,以及对象类型文档here

可以计算一个桶内的项目占用的大小

package main

import (
    "context"
    "flag"
    "fmt"
    "log"

    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

var (
    bucketName      string
    objectPrefix    string
    objectDelimiter string
    maxKeys         int
)

func init() {
    flag.StringVar(&bucketName, "bucket", "", "The `name` of the S3 bucket to list objects from.")
    flag.StringVar(&objectPrefix, "prefix", "", "The optional `object prefix` of the S3 Object keys to list.")
    flag.StringVar(&objectDelimiter, "delimiter", "",
        "The optional `object key delimiter` used by S3 List objects to group object keys.")
    flag.IntVar(&maxKeys, "max-keys", 0,
        "The maximum number of `keys per page` to retrieve at once.")
}

// Lists all objects in a bucket using pagination
func main() {
    flag.Parse()
    if len(bucketName) == 0 {
        flag.PrintDefaults()
        log.Fatalf("invalid parameters, bucket name required")
    }

    // Load the SDK's configuration from environment and shared config, and
    // create the client with this.
    cfg, err := config.LoadDefaultConfig(context.TODO())
    if err != nil {
        log.Fatalf("failed to load SDK configuration, %v", err)
    }

    client := s3.NewFromConfig(cfg)

    // Set the parameters based on the CLI flag inputs.
    params := &s3.ListObjectsV2Input{
        Bucket: &bucketName,
    }
    if len(objectPrefix) != 0 {
        params.Prefix = &objectPrefix
    }
    if len(objectDelimiter) != 0 {
        params.Delimiter = &objectDelimiter
    }

    // Create the Paginator for the ListObjectsV2 operation.
    p := s3.NewListObjectsV2Paginator(client, params, func(o *s3.ListObjectsV2PaginatorOptions) {
        if v := int32(maxKeys); v != 0 {
            o.Limit = v
        }
    })

    // Iterate through the S3 object pages, printing each object returned.
    var i int
    var total int64
    log.Println("Objects:")
    for p.HasMorePages() {
        i++

        // Next Page takes a new context for each page retrieval. This is where
        // you could add timeouts or deadlines.
        page, err := p.NextPage(context.TODO())
        if err != nil {
            log.Fatalf("failed to get page %v, %v", i, err)
        }

        // Log the objects found
        for _, obj := range page.Contents {
            // fmt.Println("Object:", *obj.Key)
            total += obj.Size
        }
    }
    fmt.Println("total", total)
}

然后,如果我是正确的,阅读s3.ListObjectsV2Input 文档,在我看来,您可以配置s3.ListObjectV2Input 实例的Prefix 成员以选择特定文件夹。该示例已经证明,如果您传入标志 -prefix=...

【讨论】:

    【解决方案2】:

    不确定是否是最简单的方法,但是您可以遍历您感兴趣的对象 list - https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html,并在本地聚合大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 1970-01-01
      • 2020-07-26
      • 2011-05-26
      • 2013-10-25
      • 1970-01-01
      相关资源
      最近更新 更多