1. 程式人生 > >阿裏雲中獲取文件及目錄列表的方法

阿裏雲中獲取文件及目錄列表的方法

filelist ces 獲取 目錄 阿裏雲 oss 一次 .com 我們 buck

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 數組有四個鍵值對,其中

  1. prefix 是我們想獲取的文件的目錄,如 test/ 即為列出目錄 test 下的所有文件及子文件夾(不遞歸獲取);

  2. delimiter 為行使文件夾功能的分割符號,如 /

  3. max-keys 是限定返回的文件和文件夾數目,這裏不是指每次最多返回 max-keys 值的數據,而是以這個值為分頁的單頁容量。如文件夾下有 100 個文件,這裏設定 max-keys 為 30,則執行後的返回結果為:[‘30 個 ObjectInfo 對象‘, ‘30 個 ObjectInfo 對象‘, ‘30 個 ObjectInfo 對象‘, ‘10 個 ObjectInfo 對象‘];

  4. 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); // 發送正確信息
    }

備忘:

  1. 若想獲取某一 Bucket 下的所有文件和文件夾,應該傳入的 $prefix 值為空字符串 ‘‘ 而不是根目錄符號 /,因為阿裏雲 OSS 本身沒有文件夾概念,傳入 / 後系統會尋找根目錄下所有首字母為 / 的文件,而不是遍歷根目錄本身;

  2. 是在阿裏雲 OSS 中,刪除文件、創建文件操作中若刪除的文件不存在或者創建的文件已存在時,OSS 不會返回錯誤提示,而是靜默或替換同名文件。個人認為刪除操作的執行準則是使得 OSS 中不具有某一文件而不是刪掉它,而創建文件的原則是靜默替換。所以在執行這些操作的時候,應該實現檢測該文件是否存在以免造成不可恢復的損失。

參考網址:

https://segmentfault.com/a/1190000006962911?utm_source=tuicool&utm_medium=referral

阿裏雲中獲取文件及目錄列表的方法