【问题标题】:Size of folder in s3 buckets3 存储桶中文件夹的大小
【发布时间】:2025-12-02 16:20:07
【问题描述】:

我正在研究 amazon s3 存储桶。我需要通过代码找到存储桶内文件夹的大小。我没有找到任何直接查找文件夹大小的方法。那么有没有其他方法可以实现这个功能呢?

编辑: 我知道 s3 存储桶中没有任何称为文件夹的内容。但我需要找到看起来像文件夹文件夹结构的所有文件的大小。也就是说,如果结构是这样的,https://s3.amazonaws.com/****/uploads/storeeoll48jipuvjbqufcap3p6on6er2bwsufv5ojzqnbe01xvw0fy58x65.png,那么我需要找到所有具有结构的文件的大小,https://s3.amazonaws.com/****/uploads/...

【问题讨论】:

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

标签: php amazon-s3


【解决方案1】:

来自 AwsConsoleApp.java AWS 开发工具包示例:

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 代码,但这段代码让我对如何编写有了一些想法。谢谢。
  • 啊,抱歉,没看标签:)
【解决方案2】:

如果你想在 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

【讨论】:

  • 我发现 s3 有时会报告此列表中的文件夹,这会导致奇怪的总数。见*.com/questions/9954521/…。我最终过滤掉了带有斜杠的文件。
【解决方案3】:

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

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

一些 S3 浏览器会自动执行此操作。我将 Cloudberry 资源管理器用于 S3。

【讨论】:

    【解决方案4】:

    文件夹在 S3 中并不存在。

    具有subfolder/myfile.txt 键的对象被软件显示为位于subfolder 文件夹中。但它只是一个显示的东西,该文件夹并不真正存在。如果您想以编程方式找出该“文件夹”中有多少项目,请遍历以子文件夹开头的所有对象/获取它们的大小并将其相加。或者查看S3Browser,它会在右键单击时为您提供大小。

    【讨论】:

      【解决方案5】:

      以下是使用 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
      

      【讨论】:

        【解决方案6】:

        这是我对 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
        

        【讨论】: