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
陣列中的delimiter
,marker
鍵值對到底有什麼作用呢?
通過檢視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 這裡使用的雲儲存服務功能,所以需要在雲儲存裡面觀察檔案的大小結構 檔...