我们有一个应用程序,用户可以在其中创建自己的网页并托管它们。我们使用S3来存储页面,因为它们是静态的。在这里,由于我们每个用户有100个存储桶的限制,我们决定使用存储桶内每个用户的文件夹。
现在,如果用户想在他的域名上托管他的网站,我们会询问他的域名(当他开始我们在我们的子域上发布时),我必须重命名该文件夹。
S3是一个平面文件系统我知道实际上没有文件夹,只有分隔符/
分隔的值,所以我无法进入该文件夹并检查它包含多少页面.API允许它一个接一个但是我们必须知道桶中的对象名称。
我浏览了文档并遇到iterators,我还没有实现。这使用了guzzle我没有经验并且在实施方面面临挑战
我还有什么其他路径可以走,或者我需要走这条路。
答案 0 :(得分: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 :(得分: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;
}