【发布时间】:2021-06-03 18:20:01
【问题描述】:
我正在使用 Amazon S3 存储桶上传文件(使用 GO SDK)。当客户的目录大小超过 2GB 时,我需要向客户收费。
bucket内的目录层次结构是:/BUCKET/uploads/CLIENTID/yyyy/mm/dd
为此,我进行了很多搜索。但找不到任何东西。
如何使用 SDK 获取存储桶内的目录大小?
【问题讨论】:
标签: amazon-web-services go amazon-s3
我正在使用 Amazon S3 存储桶上传文件(使用 GO SDK)。当客户的目录大小超过 2GB 时,我需要向客户收费。
bucket内的目录层次结构是:/BUCKET/uploads/CLIENTID/yyyy/mm/dd
为此,我进行了很多搜索。但找不到任何东西。
如何使用 SDK 获取存储桶内的目录大小?
【问题讨论】:
标签: amazon-web-services go amazon-s3
首先/uploads/CLIENTID/yyyy/mm/dd不是S3存储桶中的目录,而是prefix。 AWS 控制台中的 S3 管理 UI 可能会诱使您认为存储桶具有子目录,就像您的计算机文件系统一样,但它们是前缀。
你的问题真的是:如何获得一个桶内所有对象的总大小,具有给定的前缀?
希望这段代码sn-p能解开你的疑惑。
package main
import (
"context"
"fmt"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/service/s3"
)
// iterate all objects in a given S3 bucket and prefix, sum up objects' total size in bytes
// use: size, err := S3ObjectsSize("example-bucket-name", "/a/b/c")
func S3ObjectsSize(bucket string, prefix string, s3client S3Client) (int64, error) {
output, err := s3client.ListObjectsV2(context.TODO(), &s3.ListObjectsV2Input{
Bucket: aws.String(bucket),
Prefix: aws.String(prefix),
})
if err != nil {
return -1, fmt.Errorf("cannot ListObjectsV2 in %s/%s: %s", bucket, prefix, err.Error())
}
var size int64
for _, object := range output.Contents {
size += object.Size
}
return size, nil
}
// stub of s3.Client for dependency injection
type S3Client interface {
ListObjectsV2(ctx context.Context, params *s3.ListObjectsV2Input, optFns ...func(*s3.Options)) (*s3.ListObjectsV2Output, error)
}
【讨论】: