Ant*_*y S 8 php amazon-s3 amazon-web-services
鉴于我的S3存储桶包含如下结构中的图像:
root/portraits/portrait_001.jpg
root/landscapes/landscape_001.jpg
Run Code Online (Sandbox Code Playgroud)
root是我的存储桶,而我的root中没有其他文件,只有那些文件夹(对象),如何检索这些对象的列表?
portraits/
landscapes/
Run Code Online (Sandbox Code Playgroud)
我熟悉在ListObjects调用中使用Delimiter和Prefix.
如果我执行以下操作,则不会得到任何结果:
$objects = $s3->getIterator('ListObjects', array(
'Bucket' => $bucket,
'Delimiter' => '/',
));
foreach($objects as $object)
echo $object['Key'] . "\n";
Run Code Online (Sandbox Code Playgroud)
如果我不使用分隔符,我显然会得到一切.
我不能使用前缀,因为我想要的对象是根级别的.否则,使用前缀说我没有问题,只列出'portraits /'中的文件
从我的搜索中,我只是设法找到前几年的解决方案,只适用于aws php sdk v1或v2,我没有运气尝试那些(v3完全不同)
有什么建议?我觉得我错过了一些简单的东西,但是通过文档搜索,我找不到任何可以帮助我的东西.作为最后的手段,我只需坚持手动声明一个数组
$categories = ['portraits/', 'landscapes/']
Run Code Online (Sandbox Code Playgroud)
但是,如果我想在将来添加更多类别,并且不必担心手动添加其他类别,那么这并不理想.
任何帮助将不胜感激 :)
编辑 - 解决方案
我必须在对象转储期间查找错误的位置,但最终在ListObjects调用的返回结果中看到了共同前缀,其分隔符为"/",如下所示:
$s3->listObjects(array('Bucket' => $bucket, 'Delimiter' => '/'));
Run Code Online (Sandbox Code Playgroud)
目录实际上在Amazon S3中不存在。但是,管理控制台允许创建文件夹,并且支持路径以使目录产生错觉。
例如,目录中bar.jpg
存储的对象foo
的路径为/foo/bar.jpg
。诀窍是实际上调用了该对象,foo/bar.jpg
而不仅仅是bar.jpg
。大多数用户甚至都不会注意到差异。
在API中,通过的概念提供了列出目录的功能CommonPrefixes
,其外观与目录路径相同,并且由最后斜杠之前的对象名称(“键”)部分组成。
请参阅:使用前缀和定界符分层列出密钥