我们有一个应用程序,用户可以创建自己的网页并托管它们。我们使用 S3 来存储静态页面。在这里,由于我们对每个用户 100 个存储桶的限制,我们决定使用文件夹每个用户都在一个桶中。
现在,如果用户想在他的域上托管他的网站,我们会向他询问域名(当他开始时,我们将其发布到我们的子域上),我必须重命名该文件夹。
S3 是一个平面文件系统,我知道实际上没有文件夹,只有分隔符
/
分隔值,因此我无法进入文件夹并检查它包含多少页。API 允许逐一进行操作,但为此我们必须知道桶中的对象名称。我浏览了文档并遇到了迭代器,我还没有实现它。这使用了guzzle,我没有经验并且在实现过程中面临挑战
我还有其他路可以走吗?或者我需要走这条路。
您可以通过执行以下操作为“文件夹”的内容创建迭代器:
$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' => '/',
)));
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;
}
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
}