当前位置 : 主页 > 网络推广 > seo >

在S3中检索仅有根对象(文件夹)的列表 – aws sdk v3 php

来源:互联网 收集:自由互联 发布时间:2021-06-16
鉴于我的S3存储桶包含如下结构中的图像: root/portraits/portrait_001.jpgroot/landscapes/landscape_001.jpg root是我的存储桶,而我的root中没有其他文件,只有那些文件夹(对象),如何检索这些对象的列表
鉴于我的S3存储桶包含如下结构中的图像:

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

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

portraits/
landscapes/

我熟悉在ListObjects调用中使用Delimiter和Prefix.

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

$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' => '/'));
目录实际上并不存在于Amazon S3中.但是,管理控制台允许创建文件夹,并支持路径以提供目录的错觉.

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

从API中,列出目录的能力是通过CommonPrefixes的概念提供的,它看起来与目录路径相同,并且包含最终斜杠之前的对象名称部分(‘keys’).

见:Listing Keys Hierarchically Using a Prefix and Delimiter

网友评论