迭代亚马逊 S3 上文件夹中的对象

问题描述 投票:0回答:3

我们有一个应用程序,用户可以创建自己的网页并托管它们。我们使用 S3 来存储静态页面。在这里,由于我们对每个用户 100 个存储桶的限制,我们决定使用文件夹每个用户都在一个桶中。

现在,如果用户想在他的域上托管他的网站,我们会向他询问域名(当他开始时,我们将其发布到我们的子域上),我必须重命名该文件夹。

S3 是一个平面文件系统,我知道实际上没有文件夹,只有分隔符

/
分隔值,因此我无法进入文件夹并检查它包含多少页。API 允许逐一进行操作,但为此我们必须知道桶中的对象名称。

我浏览了文档并遇到了迭代器,我还没有实现它。这使用了guzzle,我没有经验并且在实现过程中面临挑战

我还有其他路可以走吗?或者我需要走这条路。

php amazon-web-services amazon-s3 guzzle
3个回答
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' => '/',
)));

1
投票

s3 的学习曲线有点困难,是吗?我花了大约 2 个小时,最终得到了这个 codeigniter 解决方案。我编写了一个控制器来循环我已知的子文件夹。

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

0
投票
import boto3

def list_folders_in_bucket(bucket_name, prefix):
    s3_client = boto3.client('s3')
    paginator = s3_client.get_paginator('list_objects_v2')
    operation_parameters = {'Bucket': bucket_name, 'Prefix': prefix}

    folders = set()

    for page in paginator.paginate(**operation_parameters):
        if 'Contents' in page:
            for obj in page['Contents']:
                key = obj['Key']
                # Extract folder name from the key
                folder = key.split('/')[0]
                folders.add(folder)

    return list(folders)

def lambda_handler(event, context):
    bucket_name = 'your-bucket-name'
    prefix = 'your-folder-prefix'

    folders = list_folders_in_bucket(bucket_name, prefix)
    print("Folders within '{}' prefix:".format(prefix))
    for folder in folders:
        print(folder)

    return {
        'statusCode': 200,
        'body': folders
    }
© www.soinside.com 2019 - 2024. All rights reserved.