使用Laravel Storage和AWS S3的通配符列出文件

问题描述 投票:1回答:3

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

有关如何使用S3执行此操作的任何建议?

php laravel amazon-web-services amazon-s3 laravel-5.3
3个回答
2
投票
$storage = Storage::disk('s3');
$client = $storage->getAdapter()->getClient();
$command = $client->getCommand('ListObjects');
$command['Bucket'] = $storage->getAdapter()->getBucket();
$command['Prefix'] = 'path/to/FS_1054_';
$result = $client->execute($command);
foreach ($result['Contents'] as $file) {
    //do something with $file['Key']
}

1
投票

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

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

$files = Storage::files(folder_name);

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

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')
© www.soinside.com 2019 - 2024. All rights reserved.