Php 使用带有Laravel存储和AWS S3的通配符列出文件

Php 使用带有Laravel存储和AWS S3的通配符列出文件,php,laravel,amazon-web-services,amazon-s3,laravel-5.3,Php,Laravel,Amazon Web Services,Amazon S3,Laravel 5.3,我正在将Laravel(5.3)应用程序转换为使用AWS S3作为图像存储。我需要以编程方式获取名称符合特定掩码(例如“FS_1054_*.JPG”)的图像列表,当我使用本地存储时,我可以使用glob()函数轻松地完成该操作 关于如何使用S3实现这一点,有什么建议吗?我已经找到了答案,不过我很高兴知道是否有更好的答案 使用Storage::files(文件夹名称)列出文件夹中的所有文件,这将返回一个数组。然后使用array_其中和以开头_来过滤列表: $files = Storage::file

我正在将Laravel(5.3)应用程序转换为使用AWS S3作为图像存储。我需要以编程方式获取名称符合特定掩码(例如“FS_1054_*.JPG”)的图像列表,当我使用本地存储时,我可以使用glob()函数轻松地完成该操作


关于如何使用S3实现这一点,有什么建议吗?

我已经找到了答案,不过我很高兴知道是否有更好的答案

使用
Storage::files(文件夹名称)
列出文件夹中的所有文件,这将返回一个数组。然后使用
array_其中
开头_来过滤列表:

$files = Storage::files(folder_name);

$files = array_where($files, function ($value, $key) use ($mask) {
   return starts_with(basename($value), $mask);
});

尝试根据文件名创建子文件夹,作为您需要搜索的“索引”,这样您就可以:

s3://bucket/foo/bar/FS_1054/FS_1054_123.jpg
s3://bucket/foo/bar/FS_1054/FS_1054_124.jpg
s3://bucket/foo/bar/FS_1055/FS_1055_123.jpg
s3://bucket/foo/bar/FS_1055/FS_1055_124.jpg
etc...
因此,您可以使用

Storage::disk('s3')->files('foo/bar/FS_1054')
根据您希望搜索的细粒度,您可能需要更多嵌套文件夹:

s3://bucket/foo/bar/FS/1054/FS_1054_123.jpg
s3://bucket/foo/bar/FS/1054/FS_1054_124.jpg
s3://bucket/foo/bar/FS/1055/FS_1055_123.jpg
s3://bucket/foo/bar/FS/1055/FS_1055_124.jpg
s3://bucket/foo/bar/FT/1054/FT_1054_123.jpg
s3://bucket/foo/bar/FT/1054/FT_1054_124.jpg
s3://bucket/foo/bar/FT/1055/FT_1055_123.jpg
s3://bucket/foo/bar/FT/1055/FT_1055_124.jpg
etc...
尽管这将允许您:

Storage::disk('s3')->allFiles('foo/bar/FS')
(note: allFiles() used for recursive listing)


假设您想要获取所有文件,那么您可以使用

Storage::disk('s3')->allFiles('');
它将返回bucket中包含的所有文件。但是如果你想显得特别的话

Storage::disk('s3')->allFiles('FolderName'); 

看看这张图片。当您要查看所有文件时


你的水桶是什么样子的?您是否存储了类似于
文件夹/folder/FS_1054_01.JPG
的图像?您可以通过
前缀进行搜索
,但如果您的图像嵌套在我的示例中这样的文件夹中,则搜索会有点困难。是的,它们嵌套在文件夹中。更好的方法是将文件名存储在数据库中。。想想看,当你有数百万张图片时会发生什么?
Storage::disk('s3')->allFiles('');
Storage::disk('s3')->allFiles('FolderName'); 
Storage::disk('s3')->allFiles('FolderName/2FolderName');