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;
    }
4

3 回答 3

8

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

public function FolderSize($folder) {
    $s3 = S3Client::factory(array(
                'key' => "your key",
                'secret' => "your secret key",
    ));

    $size = 0;
    $bucket = "your bucket name";
    $objects = $s3->getIterator('ListObjects', array(
        "Bucket" => $bucket, // or env('AWS_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;
}
于 2014-12-19T15:40:31.110 回答
0

使用以下两个函数:

首先检索所有对象:

$objs = $awsobject->fetchObjs('folderpath/','bucket_name');

二是获取检索到的对象的大小

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

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

于 2018-03-13T10:42:42.290 回答
-2

请使用getObjectInfo尝试以下代码。

$objInfo = $s3->getObjectInfo($bucket, "bob1");
echo $objInfo['size'];
于 2013-01-21T15:33:17.917 回答