Динамически получать размер файлов в Amazon S3 Bucket - PullRequest
5 голосов
/ 15 декабря 2010

Я видел предыдущие вопросы на тему «Как найти размер целого сегмента S3».Это несколько другой вопрос, поэтому я заранее прошу прощения, если он расплывчатый.Я приложу все усилия, чтобы объяснить, чего я пытаюсь достичь.

В настоящее время я использую Amazon S3 PHP Class .

Это то, чего я пытаюсь достичь:

  1. Я хотел бы иметь возможность просматривать мою базу данных MySQL и получать конкретные имена файлов на моем сервере S3.(Это может зависеть от пользователя).

  2. Во время цикла запросите корзину Amazon S3 (каким-либо образом) и получите размер файла каждого файла, который был в моем цикле MySQL.

  3. Сложите все размеры файлов, чтобы получить один общий приблизительный размер байта.

Итак, по сути, скажем, у меня есть пользователь, у которого есть 5 файлов наВедро S3.Как я могу сделать запрос к корзине S3, чтобы узнать, сколько данных этого пользователя хранит 5 файлов в моем корзине?

Мои извинения, если это трудно понять.Я могу переформулировать, если нужно.

Буду признателен за любое движение в правильном направлении.

Ответы [ 5 ]

12 голосов
/ 16 декабря 2010

Вы действительно должны хранить размер файла в вашей таблице Mysql.Быстрее получить информацию, меньше S3 стоимость.

Но ... попробуйте это?

$info = $s3->getObjectInfo($bucketName, $filename);
print $info['size'];
7 голосов
/ 17 декабря 2010

Теперь, когда AWS выпустил поддержку PHP SDK, вы можете рассмотреть возможность перехода на использование этого: http://aws.amazon.com/sdkforphp/.

Он также включает API для получения размера объекта: get_object_filesize ().

Я согласен с Джоном Вентимилья.Каждый звонок на S3 занимает много времени и стоит денег.Если вы сможете хранить информацию локально, это обеспечит лучшее качество обслуживания клиентов (быстрее) и будет дешевле.

3 голосов
/ 13 февраля 2013

Добавление к 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;
1 голос
/ 22 июля 2015

В 2015 году я должен использовать http://docs.aws.amazon.com/aws-sdk-php/v2/guide/feature-s3-stream-wrapper.html для этого

$client->registerStreamWrapper();

, а затем

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

Я надеюсь, что кому-то это поможет.

1 голос
/ 26 октября 2012

Я храню в своем 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;
...