当前位置: 首页 > 知识库问答 >
问题:

使用流包装器迭代S3存储桶

崔宜修
2023-03-14

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

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

每个子目录包含几个文件。我需要得到一个嵌套数组与此文件结构。

我正在使用AmazonAWSSDKforPHP2.4。2.

这是我的代码:

$dir = 's3://bucketname';

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

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

但是,结果仅列出存储桶中的文件,而不列出目录/子目录(带前缀的文件)或目录本身中的文件。

如果我遍历($dir.'/文件夹')根本没有结果。

我将递归迭代器::SELF_FIRST作为迭代器构造函数的第二个参数,只得到一级目录,没有子目录。

如何使用AWS流包装器和PHP RecursiveIterator列出桶中所有目录中的所有文件?

我希望有人能帮助我。

非常感谢。

共有1个答案

金谭三
2023-03-14

我也有同样的问题,我用以下方法解决了这个问题:

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中转储-

 类似资料:
  • 我有一个顺序数据源,表示为简单迭代器(或流)。数据相当大,不适合内存。此外,源代码可以遍历一次,并且获取成本很高。该源用于一些重过程(黑盒),该过程将迭代器(或流)作为其参数来使用线性数据。好的,很简单。但如果我有两种不同的消费程序,我该怎么办??正如我所说的,我不想将输入数据吸入类似列表的集合中。我也可以从一开始就重读源代码两次来完成我的任务,但我不喜欢这样,因为这样做没有效果。如果事实上我需要

  • 我一直在玩Java新的和闪亮的功能部分,最让我困惑的事情之一是流? 它们有什么用? 在谷歌上,我主要找到了如何使用它们的解释和实际例子,我已经记下来了,没有关于幕后魔法的具体内容,这是我感兴趣的。 我的意思并不是说,从实际意义上讲,我从一些函数语言中找到了map/filter/reduce/etc。相当快,但为什么我们需要先转换为流?Java已经有了迭代器。流和迭代器之间是否有根本的区别,比如一个

  • 问题内容: 我正在尝试在AWS ECS上设置Jenkins服务器,但是我必须发出将S3挂载到我的Docker容器的信息。 谁能为我提供可以在ECS服务中安装s3存储桶的任务定义?soi可以将我的Jenkins工作区存储在s3上 问题答案: 您可以在EC2实例中安装s3fs(或者可以将自定义AMI用于ECS群集)。将S3存储桶安装在EC2实例中,然后您就可以始终共享主机路径。

  • 问题内容: 为了利用Jdk 8中包含的多种查询方法,我尝试设计一种域模型,其中具有多重性(具有零个或多个实例)的关系的获取器返回a 而不是or 。 我的疑问是,与相比,是否还会产生任何额外的管理费用? 那么,用损害我的域模型是否有任何缺点? 或者,我是否应该始终返回或,并通过将迭代器与转换为最终结果,让最终用户选择是否使用流的决定? 请注意 ,返回a 是无效的选项,因为在这种情况下,大多数关系都是

  • Note: Seafile 服务器 5.0.0 之后,所有配置文件都移动到了统一的 conf 目录下。 了解详情. 准备工作 为了安装 Seafile 专业版服务器并使用亚马逊 S3,您需要: 按照 下载安装 Seafile 专业版服务器 指南安装基本的 Seafile 专业版服务器。 安装 python 的 boto 库。它可以用来访问 S3 服务。 sudo easy_install boto

  • 为了利用Jdk 8的中包含的各种查询方法,我试图设计域模型,其中与多重性(具有零个或多个实例)关系的获取器返回