2

Я пытаюсь перечислить все элементы в моем ковше Amazon S3. У меня есть несколько вложенных каталогов.Итерирование через ведро 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'), то результата совсем нет.

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

Как я могу использовать обертку потока AWS и PHP RecursiveIterator для отображения всех файлов во всех каталогах в моем ковше?

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

Спасибо!

+1

См., Если http://stackoverflow.com/a/4165046/208809 решает вашу проблему, например. передать 'RecursiveIteratorIterator :: SELF_FIRST' как второй аргумент в конструктор' RecursiveIteratorIterator'. Если да, рассмотрите вопрос об удалении вашего вопроса. Если он не отредактировал ваш вопрос, чтобы указать, что это не проблема в режиме итерации. – Gordon

+0

Спасибо @ Gordon. Пробовал, сам не изменил проблему (в подкаталогах не было подкаталогов или файлов). Я редактировал вопрос. – basbebe

+0

В личном названии вашего ведра содержится «.mydomain.com»? Если имя bucket на самом деле что-то вроде «bucketname», вы должны использовать «s3: // bucketname» в переменной $ dir. –

ответ

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

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

Смежные вопросы