阿裏雲中獲取文件及目錄列表的方法
1 獲取指定bucket下的文件列表(php-sdk 示例)
$prefix = ‘dir/‘; $delimiter = ‘/‘; $nextMarker = ‘‘; $maxkeys = 30; while (true) { $options = array( ‘delimiter‘ => $delimiter, ‘prefix‘ => $prefix, ‘max-keys‘ => $maxkeys, ‘marker‘ => $nextMarker, ); var_dump($options); try { $listObjectInfo = $ossClient->listObjects($bucket, $options); } catch (OssException $e) { printf(__FUNCTION__ . ": FAILED\n"); printf($e->getMessage() . "\n"); return; }// 得到nextMarker,從上一次listObjects讀到的最後一個文件的下一個文件開始繼續獲取文件列表 $nextMarker = $listObjectInfo->getNextMarker(); $listObject = $listObjectInfo->getObjectList(); $listPrefix = $listObjectInfo->getPrefixList(); var_dump($listObject); // 這裏手冊中寫的是輸出 count($listObject),以下同理 var_dump($listPrefix); if ($nextMarker === ‘‘) { break; } }
2 執行以上結果你會發現無法得到自己想要的結果,返回的是對象數據(此外,option在其中的作用)
3 分析結果:
通過查看 var_dump 輸出信息,可以發現執行結果為 OSSModelObjectInfo 對象和 OSSModelPrefixInfo 對象,分別對應 var_dump($listObject) 和 var_dump($listPrefix)
查看php-sdk代碼,會發現
其中包含了這些方法,供我們獲取指定屬性
4 options 數組數值
$options
數組有四個鍵值對,其中
-
prefix
是我們想獲取的文件的目錄,如test/
即為列出目錄test
下的所有文件及子文件夾(不遞歸獲取); -
delimiter
為行使文件夾功能的分割符號,如/
; -
max-keys
是限定返回的文件和文件夾數目,這裏不是指每次最多返回max-keys
值的數據,而是以這個值為分頁的單頁容量。如文件夾下有 100 個文件,這裏設定max-keys
為 30,則執行後的返回結果為:[‘30 個 ObjectInfo 對象‘, ‘30 個 ObjectInfo 對象‘, ‘30 個 ObjectInfo 對象‘, ‘10 個 ObjectInfo 對象‘]; -
marker
是實現分頁時指向下一分頁起始位置的標識。
註:阿裏雲 OSS 中不支持原生的文件夾,而是使用一個 0 字節的末尾為 / 的文件起到文件夾功能
5 總結:
改寫獲取文件列表的方法,使其能夠返回一個格式合適的數組:
public function fileList($dir, $maxKey = 30, $delimiter = ‘/‘, $nextMarker = ‘‘) { $fileList = []; // 獲取的文件列表, 數組的一階表示分頁結果 $dirList = []; // 獲取的目錄列表, 數組的一階表示分頁結果 $storageList = [ ‘file‘ => [], // 真正的文件數組 ‘dir‘ => [], // 真正的目錄數組 ]; while (true) { $options = [ ‘delimiter‘ => $delimiter, ‘prefix‘ => $dir, ‘max-keys‘ => $maxKey, ‘marker‘ => $nextMarker, ]; try { $fileListInfo = $this->ossClient->listObjects($this->bucket, $options); // 得到nextMarker, 從上一次 listObjects 讀到的最後一個文件的下一個文件開始繼續獲取文件列表, 類似分頁 } catch (OssException $e) { return $this->send($this->errorCode, $e->getMessage()); // 發送錯誤信息 } $nextMarker = $fileListInfo->getNextMarker(); $fileItem = $fileListInfo->getObjectList(); $dirItem = $fileListInfo->getPrefixList(); $fileList[] = $fileItem; $dirList[] = $dirItem; if ($nextMarker === ‘‘) break; } foreach ($fileList[0] as $item){ $storageList[‘file‘][] = $this->objectInfoParse($item); } foreach ($dirList[0] as $item){ $storageList[‘dir‘][] = $this->prefixInfoParse($item); } return $this->send($this->successCode, $storageList); // 發送正確信息 }
備忘:
-
若想獲取某一 Bucket 下的所有文件和文件夾,應該傳入的
$prefix
值為空字符串‘‘
而不是根目錄符號/
,因為阿裏雲 OSS 本身沒有文件夾概念,傳入/
後系統會尋找根目錄下所有首字母為/
的文件,而不是遍歷根目錄本身; -
是在阿裏雲 OSS 中,刪除文件、創建文件操作中若刪除的文件不存在或者創建的文件已存在時,OSS 不會返回錯誤提示,而是靜默或替換同名文件。個人認為刪除操作的執行準則是使得 OSS 中不具有某一文件而不是刪掉它,而創建文件的原則是靜默替換。所以在執行這些操作的時候,應該實現檢測該文件是否存在以免造成不可恢復的損失。
參考網址:
https://segmentfault.com/a/1190000006962911?utm_source=tuicool&utm_medium=referral
阿裏雲中獲取文件及目錄列表的方法