Итерация по объектам в папке на амазонке S3

У нас есть приложение, в котором пользователь может создавать свои собственные веб-страницы и размещать их. Мы используем S3 для хранения страниц, поскольку они являются static.Here, поскольку у нас есть ограничение в 100 кодов на пользователя, мы решили пойти с папками для каждого пользователь внутри ведра.

Теперь, если пользователь хочет разместить свой веб-сайт в своем домене, мы просим его доменное имя ( когда он начинает публиковать его на нашем субдомене ), и мне нужно переименовать эту папку.

S3 – это плоская файловая система. Я знаю, что на самом деле нет папок, а просто разделительных / разделенных значений, поэтому я не могу войти в папку и проверить, сколько страниц она содержит. API позволяет это один за другим, но для этого мы должны знать объект имена в ведре.

Я прошел через документы и наткнулся на итераторы , которых я еще не реализовал. Это использует жужжание, из которого у меня нет опыта и проблем с реализацией

Есть ли другой путь, который я могу взять, или мне нужно идти этим путем.

Вы можете создать итератор для содержимого «папки», выполнив следующие действия:

 $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 часов и закончил с этим решением для когнитивного языка. Я написал контроллер, чтобы перебрать мои известные подпапки.

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