阿里雲 OSS 中獲取檔案列表的方法

2021-09-18 02:55:06 字數 3676 閱讀 2969

oss php-sdk 手冊中給出使用listobjects函式獲取某一 bucket 下檔案列表的方法,如下(摘自oss php-sdk 文件):

$prefix = 'dir/';

$delimiter = '/';

$nextmarker = '';

$maxkeys = 30;

while (true) catch (os***ception $e)

$nextmarker = $listobjectinfo->getnextmarker();

$listobject = $listobjectinfo->getobjectlist();

$listprefix = $listobjectinfo->getprefixlist();

var_dump($listobject); // 這裡手冊中寫的是輸出 count($listobject),以下同理

var_dump($listprefix);

if ($nextmarker === '')

}

這段**的執行結果並沒有返回我最開始想象中的檔名稱、大小之類的陣列,而是在瀏覽器輸出了一些物件,那麼這裡該如何轉換成我們需要的資料格式呢?此外,$options陣列中的delimitermarker鍵值對到底有什麼作用呢?

通過檢視var_dump輸出資訊,可以發現執行結果為ossmodelobjectinfo物件和ossmodelprefixinfo物件,分別對應var_dump($listobject)var_dump($listprefix)

通過檢視 php-sdk 原始碼,可以看到ossmodelobjectinfo中含有getkey()getlastmodified()等方法,因而可以藉此獲取我們想得到的資料格式,如下:

/* 解析 prefixinfo 類 */

private function prefixinfoparse(prefixinfo $prefixinfo)

/* 解析 objectinfo 類 */

public function objectinfoparse(objectinfo $objectinfo)

阿里雲 oss 中不支援原生的資料夾,而是使用乙個 0 位元組的末尾為/的檔案起到資料夾功能。

$options陣列有四個鍵值對,其中

prefix是我們想獲取的檔案的目錄,如test/即為列出目錄test下的所有檔案及子資料夾(不遞迴獲取);

delimiter為行使資料夾功能的分割符號,如/

max-keys是限定返回的檔案和資料夾數目,這裡不是指每次最多返回max-keys值的資料,而是以這個值為分頁的單頁容量。如資料夾下有 100 個檔案,這裡設定max-keys為 30,則執行後的返回結果為:['30 個 objectinfo 物件', '30 個 objectinfo 物件', '30 個 objectinfo 物件', '10 個 objectinfo 物件'];

marker是實現分頁時指向下一分頁起始位置的標識。

我們可以改寫獲取檔案列表的方法,使其能夠返回乙個格式合適的陣列:

public function filelist($dir, $maxkey = 30, $delimiter = '/', $nextmarker = '')  catch (os***ception $e) 

$nextmarker = $filelistinfo->getnextmarker();

$fileitem = $filelistinfo->getobjectlist();

$diritem = $filelistinfo->getprefixlist();

$filelist = $fileitem;

$dirlist = $diritem;

if ($nextmarker === '') break;

}foreach ($filelist[0] as $item)

foreach ($dirlist[0] as $item)

return $this->send($this->successcode, $storagelist); // 傳送正確資訊

}

執行這一方法可以返回乙個 json,格式如下:

,

],"dir": []}

}

若想獲取某一 bucket 下的所有檔案和資料夾,應該傳入的$prefix值為空字串''而不是根目錄符號/,因為阿里雲 oss 本身沒有資料夾概念,傳入/後系統會尋找根目錄下所有首字母為/的檔案,而不是遍歷根目錄本身;

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

使用 ram 訪問控制對 oss 進行許可權管理的時候,如果使用自定義的許可權策略,該策略只會在使用 sdk 或 api 的時候體現。如現在自定義乙個讀寫 oss 下某一 bucket 的許可權策略,這一策略在 sdk 中是可以正常起到限制作用的,而在 ram 控制台中,卻被提示沒有 oss 的訪問許可權。猜測可能是阿里雲 oss 服務對控制台下的許可權管理還是以服務為單位,目前還沒有把許可權精確到 oss 的單個 bucket 中。

],"version": "1"

}

2016.9.22 更新

關於備忘第二點中 ram 訪問控制的問題,我提交了乙份工單給 oss,得到的反饋是,如果想要在 ram 控制台中以圖形化介面訪問 bucket,需要在statement中再新增乙個策略,其action值為listbuckets,單獨給出乙個*許可權是不夠的,如下:

,

// 策略 2:用於 ram 控制台顯示 bucket 列表

],"version": "1"

}

listbuckets這一策略中,resource值只能是acs:oss:*:*:*而不能是acs:oss:*:*:oss-test,不然還是會在 ram 控制台提示沒有訪問許可權。雖然寫成這樣會使得登入 ram 控制台的人看到所有的 buckets,但其對除oss-test之外的 buckets 是沒有讀寫許可權的。

阿里雲訪問控制幫助文件

阿里雲oss 檔案上傳

寫在前面 阿里雲oss的各種sdk,都是對它的api進行的封裝。所以如果我們直接呼叫api時出錯,卻又不知道 出問題時,可以直接閱讀sdk的原始碼,找到問題所在。首先貼一下阿里雲oss官網貼出的簽名計算方式 authorization oss accesskeyid signature signat...

阿里雲OSS 上傳檔案

阿里雲後台管理 api 整合教程 key 網域名稱的查詢 1 檢視上傳的檔案在哪?a 阿里雲,進入官網。然後進入管理控制台 b 左側選單欄,進入物件儲存 oss c 進入 bucket 管理頁面,點選建立的bucket 名稱 d 進入bucket 管理介面,點選左側選單 bucket屬性 選單檢視b...

阿里雲oss 大檔案上傳

最近公司在做工程專案,實現檔案雲儲存上傳 網上找了很久,發現很多專案都存在一些問題,但還是讓我找到了乙個成熟的專案。工程 對專案的檔案雲儲存上傳功能做出分析,找出檔案上傳的原理,對檔案的雲儲存模式深入了解。執行 檔案存放根目錄 h 這裡使用的雲儲存服務功能,所以需要在雲儲存裡面觀察檔案的大小結構 檔...