使用 Go SDK 2 获取 Amazon S3 中文件夹的大小

asa*_*hez 1 amazon-s3 go amazon-web-services

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

小智 5

鉴于该示例以及此处的对象类型文档

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

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)
}
Run Code Online (Sandbox Code Playgroud)

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