我正在转换Laravel(5.3)应用程序以使用AWS S3作为图像存储。我需要以编程方式获得名称符合特定掩码的图像列表(例如'FS_1054 _ * .JPG'),当我使用本地存储时,我可以很轻松地使用glob()函数。使用通配符在Laravel存储和AWS S3中列出文件
任何关于如何使用S3做到这一点的建议?
我正在转换Laravel(5.3)应用程序以使用AWS S3作为图像存储。我需要以编程方式获得名称符合特定掩码的图像列表(例如'FS_1054 _ * .JPG'),当我使用本地存储时,我可以很轻松地使用glob()函数。使用通配符在Laravel存储和AWS S3中列出文件
任何关于如何使用S3做到这一点的建议?
我找到了答案,但很高兴知道是否有更好的答案。
使用Storage :: files(folder_name)列出文件夹中的所有文件,这将返回一个数组。然后使用array_where和STARTS_WITH过滤列表:
$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')->files('foo/bar/FS/1054')
那么你的水桶是什么样子?你是否存储像“文件夹/文件夹/ FS_1054_01.JPG”的图像?你可以用'前缀'来搜索,但是如果你的图像像我的例子那样嵌套在文件夹中,它会更难一些。 – cmorrissey
是的,它们嵌套在文件夹中。 –