S3存储桶中文件夹的大小

5
我正在使用Amazon S3存储桶,需要通过代码查找桶内文件夹的大小。我没有找到直接获取文件夹大小的方法。是否有其他方法可以实现此功能?
编辑:我知道S3存储桶中没有所谓的文件夹。但我需要找到所有看起来像文件夹结构的文件的大小。也就是说,如果结构像这样:https://s3.amazonaws.com/****/uploads/storeeoll48jipuvjbqufcap3p6on6er2bwsufv5ojzqnbe01xvw0fy58x65.png,那么我需要找到具有相同结构的所有文件的大小,例如:https://s3.amazonaws.com/****/uploads/...

你的意思是文件夹内容的大小吗? - reach4thelasers
是的。文件夹及其子文件夹中所有文件内容的大小。 - Stranger
使用编程语言(哪种语言?)或工具(哪个工具?)进行编程? - reach4thelasers
帮助将其作为问题的一部分,标签更多用于搜索,例如我经常搜索amazon-s3标签,但我不是PHP开发人员。我看到被标记的答案用户也不清楚使用什么语言... - reach4thelasers
6个回答

5

来自 AwsConsoleApp.java AWS SDK 示例:

List<Bucket> buckets = s3.listBuckets();
long totalSize  = 0;
int  totalItems = 0;
for (Bucket bucket : buckets)
{
    ObjectListing objects = s3.listObjects(bucket.getName());
    do {
        for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) {
            totalSize += objectSummary.getSize();
            totalItems++;
        }
        objects = s3.listNextBatchOfObjects(objects);
    } while (objects.isTruncated());
    System.out.println("You have " + buckets.size() + " Amazon S3 bucket(s), " +
                    "containing " + totalItems + " objects with a total size of " + totalSize + " bytes.");
}

虽然我需要 PHP 代码,但这段代码给了我写代码的一些思路。谢谢。 - Stranger
啊,抱歉,我没有看标签 :) - jimpic

5

如果你想在Python中使用Boto,这是一个可以尝试的小脚本:

import boto
conn=boto.connect_s3('api_key','api_secret')
bucket=conn.get_bucket('bucketname');
keys=bucket.list('path')
size=0
for key in keys:
        size+= key.size
print size

1
我发现S3有时会在此列表中报告文件夹,这会导致奇怪的总数。请参见https://dev59.com/A2kw5IYBdhLWcg3wXZT8。最终,我过滤掉了带有尾随斜杠的文件。 - Thomas4019

1
这是我使用boto3的方法:
该函数从存储桶返回目录(键)大小,单位为MB。
s3_client   = client('s3')  
def get_s3_folder_size_mb(bucket,prefix):
    len = 0
    s3_result =  s3_client.list_objects_v2(Bucket=bucket, Prefix=prefix)
    for key in s3_result['Contents']:
        len+=key['Size'] 
        while s3_result['IsTruncated']:
            continuation_key = s3_result['NextContinuationToken']
            s3_result = s3_client.list_objects_v2(Bucket=bucket, Prefix=prefix, ContinuationToken=continuation_key)
            for key in s3_result['Contents']:
                len+=key['Size']
    return len/1024/1024

0

以下是使用boto3的方法:

import boto3

bucketName = '<bucketname>'
client = boto3.client('s3')

def get_all_objects_in_prefix(prefix):
    lastkey = ''
    while True:
        response = client.list_objects(
            Bucket=bucketName,
            Prefix=prefix,
            Marker=lastkey,
            MaxKeys=1000
        )
        if not response.get('Contents'):
            break
        lastkey = [item['Key'] for item in response['Contents']][-1]
        for item in response['Contents']:
            yield item

def get_filesize_of_prefix(prefix):
    size = 0
    for item in get_all_objects_in_prefix(prefix):
        size += item['Size']

    return size

0

S3中没有所谓的“文件夹”,它是一个扁平的文件系统。文件名(存储桶键)可以包含斜杠(/),各种存储桶浏览器可以利用这一点来解释文件夹-文件结构。

要知道S3中“文件夹”的大小,您首先必须知道包含该“文件夹”路径子字符串的所有单个文件的键。如果您的存储桶包含数百万个文件,则这将是一项非常昂贵的操作。

一些S3浏览器会自动执行此操作。我使用Cloudberry explorer for S3。


0

S3中实际上不存在文件夹。

具有键为subfolder/myfile.txt的对象被软件显示为位于subfolder文件夹中。但这只是一个显示问题,文件夹实际上并不存在。如果您想编程方式查找该“文件夹”中有多少项,请循环遍历所有以subfolder/开头的对象,获取它们的大小并将其相加。或者,可以查看S3Browser,右键单击即可获得大小信息。


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