4

ユーザーが独自の Web ページを作成してホストできるアプリケーションがあります。ページは静的であるため、S3 を使用してページを保存しています。ここでは、ユーザーごとに 100 バケットの制限があるため、それぞれにフォルダーを使用することにしました。バケット内のユーザー。

現在、ユーザーが自分のドメインで自分の Web サイトをホストしたい場合は、ドメイン名を尋ねます (ユーザーが開始したときに、サブドメインで公開します)。フォルダーの名前を変更する必要があります。

S3 はフラット ファイル システムであり、実際にはフォルダーがなく、区切り記号で/区切られた値だけがあることがわかっているため、フォルダーに移動して含まれるページ数を確認することはできません。API では 1 つずつ許可されますが、そのためにはオブジェクト名を知る必要があります。バケツで。

私はドキュメントを調べて、まだ実装していないイテレータに出くわしましたこれは、経験のないガズルを使用し、実装で課題に直面しています

私が取ることができる他の道はありますか、それとも私はこの道を行く必要があります.

4

2 に答える 2

11

次のようにして、「フォルダー」の内容の反復子を作成できます。

$objects = $s3->getIterator('ListObjects', array(
    'Bucket'    => 'bucket-name',
    'Prefix'    => 'subfolder-name/',
    'Delimiter' => '/',
));

foreach ($objects as $object) {
    // Do things with each object
}

カウントだけが必要な場合は、次のようにすることができます。

echo iterator_count($s3->getIterator('ListObjects', array(
    'Bucket'    => 'bucket-name',
    'Prefix'    => 'subfolder-name/',
    'Delimiter' => '/',
)));
于 2013-09-19T16:39:08.503 に答える
1

s3 の学習曲線のビット、え?私は約2時間を費やし、最終的にこのコードイグナイターソリューションにたどり着きました。既知のサブフォルダーをループするコントローラーを作成しました。

function s3GetObjects($bucket) {
    $CI =& get_instance();
    $CI->load->library('aws_s3');

    $prefix = $bucket.'/';

    $objects = $CI->aws_s3->getIterator('ListObjects', array(
        'Bucket'    => $CI->config->item('s3_bucket'),
        'Prefix'    => $prefix,
        'Delimiter' => '/',
    ));

    foreach ($objects as $object) {

        if ($object['Key'] == $prefix) continue;

        echo $object['Key'].PHP_EOL;

        if (!file_exists(FCPATH.$object['Key'])) {

            try {
                $r = $CI->aws_s3->getObject(array(
                    'Bucket' => $CI->config->item('s3_bucket'),
                    'Key'    => $object['Key'],
                    'SaveAs' => FCPATH.$object['Key']
                ));
            } catch (Exception $e) {
                echo $e->getMessage().PHP_EOL;
                //return FALSE;
            }

            echo PHP_EOL;
        } else {
            echo ' -- file exists'.PHP_EOL;
        }
    }

    return TRUE;
}
于 2016-04-28T21:51:28.780 に答える