2016-11-03 62 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') 
相關問題