2016-11-03 25 views
1

我正在转换Laravel(5.3)应用程序以使用AWS S3作为图像存储。我需要以编程方式获得名称符合特定掩码的图像列表(例如'FS_1054 _ * .JPG'),当我使用本地存储时,我可以很轻松地使用glob()函数。使用通配符在Laravel存储和AWS S3中列出文件

任何关于如何使用S3做到这一点的建议?

+0

那么你的水桶是什么样子?你是否存储像“文件夹/文件夹/ FS_1054_01.JPG”的图像?你可以用'前缀'来搜索,但是如果你的图像像我的例子那样嵌套在文件夹中,它会更难一些。 – cmorrissey

+0

是的,它们嵌套在文件夹中。 –

回答

0

我找到了答案,但很高兴知道是否有更好的答案。

使用Storage :: files(folder_name)列出文件夹中的所有文件,这将返回一个数组。然后使用array_where和STARTS_WITH过滤列表:

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

更好的方法是将文件名存储在数据库中。想想看,当你拥有数百万的图像时会发生什么? –

0

尝试根据文件名由你需要搜索的“指数”创建子文件夹,让你有这样的:

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')->files('foo/bar/FS/1054') 
相关问题