Amazon S3如何获取特定对象、文件和文件夹的大小

3

我将每个用户的数据存储在一个名为其用户名的对象内部的存储桶中,例如我的存储桶是“my.bucket/bob1”、“my.bucket/bob2”等。我可以使用Amazon S3获取存储桶的大小:$s3->get_bucket_filesize($bucket,true); 但我需要计算“my.bucket/bob1”的大小。我尝试使用

$s3->get_object_filesize($bucket, "bob1");

但是这只返回该对象的大小,因为在我的客户端上,我将其视为文件夹,所以大小为0。

但是我需要以高效的方式获取用户文件夹级别的大小,以节省成本和时间。

编辑:

使用下面的代码,但这非常慢,我有数千个文件,从1KB到1GB+,这段代码需要太长时间。

    function get_size($bucket,$path,$s3){
    $size = 0;

    $response = $s3->list_objects($bucket,array(
    'prefix' => $path.'/'

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

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

        return $size;
    }
3个回答

8

您可以使用以下代码来获取文件夹大小。如果文件夹中没有文件,则返回0,否则将计算文件夹中所有文件的大小并返回以GB、MB或KB为单位的大小。

public function FolderSize($folder) {
    $s3 = new S3Client([
        'version' => 'latest',
        'region' => config('filesystems.disks.s3.region'),
        'credentials' => [
            'key' => config('filesystems.disks.s3.key'),
            'secret' => config('filesystems.disks.s3.secret'),
        ],
    ]);

    $size = 0;
    $bucket = "your bucket name";
    $objects = $s3->getIterator('ListObjects', array(
        "Bucket" => $bucket, // or config('filesystems.disks.s3.bucket'),
        "Prefix" => $folder
    ));
    foreach ($objects as $object) {
        $size = $size+$object['Size'];
    }

    return $this->formatSizeUnits($size);
     
    
}
public function formatSizeUnits($bytes) {
    if ($bytes >= 1073741824) {
        $bytes = number_format($bytes / 1073741824, 2) . ' GB';
    } elseif ($bytes >= 1048576) {
        $bytes = number_format($bytes / 1048576, 2) . ' MB';
    } elseif ($bytes >= 1024) {
        $bytes = number_format($bytes / 1024, 2) . ' KB';
    } elseif ($bytes > 1) {
        $bytes = $bytes . ' bytes';
    } elseif ($bytes == 1) {
        $bytes = $bytes . ' byte';
    } else {
        $bytes = '0 bytes';
    }
    return $bytes;
}

如果您不在类内部使用函数,则无需在函数名称前使用public。 - Amir Md Amiruzzaman

0
请使用以下两个函数:
第一个函数用于检索所有对象:
$objs = $awsobject->fetchObjs('folderpath/','bucket_name');

第二步是获取检索对象的大小

$used = $awsobject->folderSizeRawPrettyFromSource($objs);

它将返回以MB为单位的大小。


-2
请尝试使用getObjectInfo下面的代码。
$objInfo = $s3->getObjectInfo($bucket, "bob1");
echo $objInfo['size'];

4
我正在使用最新版本的 AWS-PHP SDK,但此方法未在其中列出。 - Asghar
这个函数是从2007年开始的。 - Mecanik

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