【问题标题】:Retrieve list of only root objects (folders) in S3 - aws sdk v3 php在 S3 中检索仅根对象(文件夹)的列表 - aws sdk v3 php
【发布时间】:2015-08-21 04:41:23
【问题描述】:

鉴于我的 S3 存储桶包含如下结构的图像:

root/portraits/portrait_001.jpg
root/landscapes/landscape_001.jpg

root 是我的存储桶,我的根目录中没有其他文件,只有那些文件夹(对象),我如何检索这些对象的列表?

portraits/
landscapes/

我熟悉在 ListObjects 调用中使用分隔符和前缀。

如果我执行以下操作,我不会得到任何结果:

$objects = $s3->getIterator('ListObjects', array(
    'Bucket' => $bucket,
    'Delimiter' => '/',
));

foreach($objects as $object)
    echo $object['Key'] . "\n";

如果我不使用分隔符,显然我会得到一切。

我不能使用前缀,因为我想要的对象是根级别的。否则,我可以使用前缀来表示,只列出 'portraits/' 中的文件

从我的搜索中,我只设法找到了前几年只适用于 aws php sdk v1 或 v2 的解决方案,但我没有运气尝试这些(v3 完全不同)

有什么建议吗?我觉得我错过了一些简单的东西,但是通过文档搜索,我找不到任何可以帮助我的东西。作为最后的手段,我只需要坚持手动声明一个数组

$categories = ['portraits/', 'landscapes/']

但如果我想在将来添加更多类别并且不必担心手动添加另一个类别,这并不理想。

任何帮助将不胜感激:)

编辑 - 解决方案

在我的对象转储期间,我一定是找错了地方,但最终在 ListObjects 调用的返回结果中看到了带有“/”分隔符的通用前缀,如下所示:

$s3->listObjects(array('Bucket' => $bucket, 'Delimiter' => '/'));

【问题讨论】:

  • 您是否尝试过使用从ListBucket 返回的CommonPrefixes 列表? docs.aws.amazon.com/AmazonS3/latest/dev/…
  • 最初我在任何地方都找不到公共前缀,但也许我在将对象转储到错误的地方时忽略了这一点。我现在才找到它们。感谢您的帮助:)
  • 具有以下表达式的分页器 '[CommonPrefixes[].Prefix, Contents[].Key][]' 也有助于stackoverflow.com/a/65245799/1172872

标签: php amazon-web-services amazon-s3


【解决方案1】:

目录实际上并不存在于 Amazon S3 中。但是,管理控制台允许创建文件夹,并且支持路径以产生目录的错觉。

例如,存储在foo 目录中的对象bar.jpg 的路径为/foo/bar.jpg。诀窍是该对象实际上被称为foo/bar.jpg 而不仅仅是bar.jpg。大多数用户甚至不会注意到差异。

从 API 中,列出目录的能力是通过 CommonPrefixes 的概念提供的,它看起来与目录路径相同,并且由最后一个斜杠之前的对象名称(“键”)部分组成。

见:Listing Keys Hierarchically Using a Prefix and Delimiter

【讨论】:

    猜你喜欢
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2017-06-29
    • 2014-07-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多