【问题标题】:iterating through S3 bucket with stream wrapper使用流包装器遍历 S3 存储桶
【发布时间】:2013-08-11 11:38:46
【问题描述】:

我正在尝试列出我的 Amazon S3 存储桶中的所有项目。 我有几个嵌套目录。

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

每个子目录包含多个文件。 我需要用这个文件结构得到一个嵌套数组。

我正在使用适用于 PHP 2.4.2 的 Amazon AWS 开发工具包

这是我的代码:

$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 列出存储桶中所有目录中的所有文件?

我希望有人可以帮助我。

谢谢!

【问题讨论】:

  • 查看stackoverflow.com/a/4165046/208809 是否解决了您的问题,例如将RecursiveIteratorIterator::SELF_FIRST 作为第二个参数传递给RecursiveIteratorIterator 的构造函数。如果是这样,请考虑删除您的问题。如果不是edit你的问题要指出这不是迭代模式的问题。
  • 谢谢@Gordon。试过了,并没有改变问题本身(没有显示子目录或子目录中的文件)。我编辑了问题。
  • 您列出的存储桶的实际名称是否包含“.mydomain.com”?如果存储桶名称实际上类似于“bucketname”,那么您只能在 $dir 变量中使用“s3://bucketname”。
  • @MichaelDowling:是的,存储桶的实际名称包含我的 domain.com - 我相应地编辑了帖子,谢谢!
  • 我们昨晚刚刚发布了 SDK。你能检查一下它是否解决了你的问题吗?

标签: php amazon-web-services amazon-s3 stream-wrapper 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);
}

现在,如果您在 $this->files 中执行 DUMP,应该会显示存储桶上的所有文件。

【讨论】:

    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 2020-08-05
    • 2014-08-05
    • 2020-07-07
    • 1970-01-01
    • 2012-03-15
    • 2023-03-31
    • 2021-03-16
    相关资源
    最近更新 更多