动态获取 Amazon S3 存储桶中文件的大小

Posted

技术标签:

【中文标题】动态获取 Amazon S3 存储桶中文件的大小【英文标题】:Dynamically Get Size of Files in Amazon S3 Bucket 【发布时间】:2011-05-26 01:50:52 【问题描述】:

我之前看过有关“如何找到整个 S3 存储桶的大小”的问题。这是一个不同的问题——所以如果它含糊不清,我提前道歉。我会尽力解释我想要达到的目标。

我目前正在使用Amazon S3 php Class。

这就是我想要达到的目标:

    我希望能够遍历我的 mysql 数据库并获取 S3 服务器上文件的特定文件名。 (这可能基于用户)。

    在循环期间,查询 Amazon S3 存储桶(以某种方式)并获取我的 MySQL 循环中每个文件的文件大小。

    将所有文件大小相加,得到一个总的近似字节大小。

所以,基本上,假设我有一个用户在 S3 存储桶上有 5 个文件。我如何能够查询 S3 存储桶,以查看该用户的 5 个文件在我的存储桶中存储了多少数据?

如果这很难理解,我深表歉意。如果需要,我可以重新发音。

我们将不胜感激。

【问题讨论】:

【参考方案1】:

您确实应该将文件大小存储在您的 Mysql 表中。更快地获取信息,更少的 S3 成本。

但是……试试这个?

$s3 = new Aws\S3\S3Client($parameters);
$obj_data = $s3->headObject([
   'Bucket' => $bucket,
   'Key'    => $key
]);
echo 'Size is: '.$obj_data['ContentLength'];

【讨论】:

赞成“你真的应该将文件大小存储在你的 Mysql 表中” php aws sdk 中没有getObjectInfo 方法。 docs.aws.amazon.com/aws-sdk-php/v2/api/…docs.aws.amazon.com/aws-sdk-php/v3/api/…【参考方案2】:

既然 AWS 已经发布了一个支持 PHP 开发工具包,您可能需要考虑切换到使用它:http://aws.amazon.com/sdkforphp/。

它还包括用于获取对象大小的 api:get_object_filesize()。

我同意约翰·文蒂米利亚的观点。每次调用 S3 都需要时间和金钱。如果您可以将信息存储在本地,它将提供更好的客户体验(更快)并且更便宜。

【讨论】:

我不知道 AWS PHP SDK。我将不得不玩弄它。关于存储信息,你们俩都是对的。我正在本地存储文件大小。非常感谢。【参考方案3】:

在 2015 年,我必须为此使用 http://docs.aws.amazon.com/aws-sdk-php/v2/guide/feature-s3-stream-wrapper.html

$client->registerStreamWrapper();

然后

$size = filesize('s3://' . $bucket . '/' . $key);

我希望这会对某人有所帮助。

【讨论】:

【参考方案4】:

添加到chrisjmccreadie 答案。

list_objects('') 方法是分页的,它提供的结果可能不会超过 1000,默认为 1000,因此您需要通过分页才能获得完整准确的结果。

但是您可以使用get_object_list() 方法,该方法将返回max-keys 结果。

include("sdk.class.php");

    $s3 = new AmazonS3();

    $response = $s3->get_object_list('mojag');
    foreach ($response->body as $object)
    
        //print_r($object);
        echo $object->Key.'('.$object->Size.')</br>';
        $size  = $size+$object->Size;

    
    $size = number_format($size / 1024 / 1024, 2); 

    echo $size;

【讨论】:

【参考方案5】:

我确实存储在我的 MYSQL 中,但有时您需要进行清理,并且很高兴知道您的 MSYQL 和 S3 之间的任何不匹配。当我需要获取文件大小时,我会列出所有文件并计算文件大小

include("sdk.class.php");

        $s3 = new AmazonS3();

        $response = $s3->list_objects('mojag');
        foreach ($response->body as $object)
        
            //print_r($object);
            echo $object->Key.'('.$object->Size.')</br>';
            $size  = $size+$object->Size;

        
        $size = number_format($size / 1024 / 1024, 2); 

        echo $size;

【讨论】:

以上是关于动态获取 Amazon S3 存储桶中文件的大小的主要内容,如果未能解决你的问题,请参考以下文章

复制同一 Amazon S3 存储桶中的文件

如何重命名 Amazon S3 存储桶中的文件? [复制]

Amazon S3 boto:如何重命名存储桶中的文件?

使用 Node JS 从 Amazon S3 私有存储桶中检索图像

我们如何为 Amazon S3 存储桶中的文件夹设置 CORS

如何(批量)删除Amazon S3存储桶中几百个文件的列表