我正在转换Laravel(5.3)应用程序以将AWS S3用作图像存储。我需要以编程方式获取名称符合特定掩码的图像列表(例如'FS_1054 _ *。JPG'),当我使用本地存储时,我可以使用glob()函数轻松完成。
有关如何使用S3执行此操作的任何建议吗?
答案 0 :(得分: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 :(得分:1)
假设如果要获取所有文件,则可以使用此
Storage::disk('s3')->allFiles('');
它将返回存储桶中的所有文件。但是如果您想显得特别
Storage::disk('s3')->allFiles('FolderName');
或
Storage::disk('s3')->allFiles('FolderName/2FolderName');
看这张图片。当您要查找所有文件时。
答案 2 :(得分:0)
我找到了答案,但很高兴知道是否有更好的答案。
使用Storage::files(folder_name)
列出文件夹中的所有文件,这将返回一个数组。然后使用array_where
和starts_with
过滤列表:
$files = Storage::files(folder_name);
$files = array_where($files, function ($value, $key) use ($mask) {
return starts_with(basename($value), $mask);
});
答案 3 :(得分: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')