3

各ユーザーのデータをバケットに保存し、ユーザー名オブジェクトをバケット内に保存しています。私のバケツは「my.bucket/bob1」「my.bucket/bob2」などです。AmazonS3を使用してバケットのサイズを取得できます。$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

次の2つの関数を使用します。

最初にすべてのオブジェクトを取得します。

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

取得したオブジェクトのサイズを取得する2番目

$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 に答える