Перебирая ведро S3 с оберткой потока

Я пытаюсь перечислить все предметы в моем корзине Amazon S3. У меня есть несколько вложенных каталогов в нем.

  • dir1 /
  • dir1 / subdir1 /
  • dir1 / subdir2 /
  • dir1 / subdir3 /
  • dir2 /
  • dir2 / subdir1 /
  • dir2 / subdir2 /
  • ...

Каждый подкаталог содержит несколько файлов. Мне нужно получить вложенный массив с этой файловой структурой.

Я использую Amazon AWS SDK для PHP 2.4.2

Это мой код:

$dir = 's3://bucketname';

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));

foreach ($iterator as $file) {
    echo $file->getType() . ': ' . $file . "\n";
}

Однако в результате отображаются только файлы, лежащие в корзине, но не файлы, лежащие в каталогах / подкаталогах (файлы с префиксами) или сами каталоги.

Если я переберу ($dir.'/folder') нет результата вообще.

II проход RecursiveIteratorIterator::SELF_FIRST в качестве второго аргумента для конструктора итератора, я получаю только каталоги первого уровня - без подкаталогов.

Как я могу использовать потоковую обертку AWS и PHP RecursiveIterator, чтобы вывести список всех файлов во всех каталогах в моей корзине?

Я надеюсь, что кто-то может помочь мне.

Спасибо!

1 ответ

Решение

У меня была та же проблема, и я решил это с помощью:

use \Aws\S3\StreamWrapper;
use \Aws\S3\S3Client;

private $files = array();
private $s3path = 'YOUR_BUCKET';
private $s3key = 'YOUR_KEY';
private $s3auth = 'YOUR_AUTH_CODE';

public function recursive($path)
{
    $dirHandle = scandir($path);

    foreach($dirHandle as $file)
    {
        if(is_dir($path.$file."/") && $file != '.' && $file != '..')
        {
            $this->recursive($path.$file."/");
        }
        else
        {
           $this->files[$path.$file] = $path.$file;
        }
    }
}

public function registerS3()
{
    $client = S3Client::factory(array(
        'key'    => $this->s3key,
        'secret' => $this->s3auth
    ));

    $wp = new StreamWrapper();
    $wp->register($client);
}

public function run()
{
    $folder = 's3://'.$this->s3path.'/';

    $this->registerS3();
    $this->recursive($folder);
}

Теперь, если вы делаете DUMP в $this->files, должны отобразиться все файлы в корзине.

Другие вопросы по тегам