在Amazon S3上迭代文件夹中的对象

4
我们有一个应用程序,用户可以创建自己的网页并将其托管。由于页面是静态的,因此我们使用S3存储它们。由于每个用户的限制为100个存储桶,因此我们决定在存储桶内为每个用户使用文件夹。
现在,如果用户想在自己的域上托管他的网站,我们会要求他提供域名(当他开始时,我们会将其发布在我们的子域上),然后我必须重命名文件夹。
S3是一个平面文件系统,我知道实际上没有文件夹,只有以分隔符/分隔的值,所以我无法进入文件夹并检查它包含多少页。API允许逐个进行,但是对于这一点,我们必须知道存储桶中的对象名称。
我阅读了文档,并发现了迭代器,但我还没有实现它。这需要使用guzzle,而我没有经验,在实现中遇到了挑战。
是否有其他路径可走,还是我需要按照这种方式继续?
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' => '/',
)));

请建议。我正在使用这个 API 的精简版本,因为我不需要其余的包,并且出于明显的原因,我不想有不必要的代码。这个API有一个S3.php文件,它不包括迭代器函数,比如getListObjectsIterator,那么我该如何将上述代码合并到现有类中呢?如果我查看官方代码,它涉及命名空间和依赖项,因此必须包含整个包。此外,它使用guzzle,我必须在我的服务器上安装它,但我不在我的应用程序中使用它。 - KillABug
您正在使用的 tpyo S3 类不受 AWS 支持,也没有迭代器功能。我上面建议的代码仅适用于官方的 AWS SDK for PHP。使用官方 SDK 并不困难;您可以通过 Composer 或 PEAR 安装它,或者直接下载并包含 aws.phar。用户指南位于此处 - Jeremy Lindblom
非常感谢您的澄清。我一定会继续使用AWS官方SDK进行开发工作。 - KillABug

1
使用S3有点陡峭,是吗?我花了大约两个小时最终得到了这个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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接