摘要:猜測(cè)可能是阿里云服務(wù)對(duì)控制臺(tái)下的權(quán)限管理還是以服務(wù)為單位,目前還沒(méi)有把權(quán)限精確到的單個(gè)中。參考阿里云訪問(wèn)控制幫助文檔
1. 問(wèn)題
OSS PHP-SDK 手冊(cè)中給出使用 listObjects 函數(shù)獲取某一 Bucket 下文件列表的方法,如下(摘自 OSS 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 "); printf($e->getMessage() . " "); return; } // 得到nextMarker,從上一次listObjects讀到的最后一個(gè)文件的下一個(gè)文件開始繼續(xù)獲取文件列表 $nextMarker = $listObjectInfo->getNextMarker(); $listObject = $listObjectInfo->getObjectList(); $listPrefix = $listObjectInfo->getPrefixList(); var_dump($listObject); // 這里手冊(cè)中寫的是輸出 count($listObject),以下同理 var_dump($listPrefix); if ($nextMarker === "") { break; } }
這段代碼的執(zhí)行結(jié)果并沒(méi)有返回我最開始想象中的文件名稱、大小之類的數(shù)組,而是在瀏覽器輸出了一些對(duì)象,那么這里該如何轉(zhuǎn)換成我們需要的數(shù)據(jù)格式呢?此外,$options 數(shù)組中的 delimiter,marker 鍵值對(duì)到底有什么作用呢?
2. 返回值通過(guò)查看 var_dump 輸出信息,可以發(fā)現(xiàn)執(zhí)行結(jié)果為 OSSModelObjectInfo 對(duì)象和 OSSModelPrefixInfo 對(duì)象,分別對(duì)應(yīng) var_dump($listObject) 和 var_dump($listPrefix)。
通過(guò)查看 PHP-SDK 源碼,可以看到 OSSModelObjectInfo 中含有 getKey(),getLastModified() 等方法,因而可以借此獲取我們想得到的數(shù)據(jù)格式,如下:
/* 解析 prefixInfo 類 */ private function prefixInfoParse(PrefixInfo $prefixInfo){ return [ "dir" => $prefixInfo->getPrefix(), ]; } /* 解析 objectInfo 類 */ public function objectInfoParse(ObjectInfo $objectInfo) { return [ "name" => $objectInfo->getKey(), "size" => $objectInfo->getSize(), "update_at" => $objectInfo->getLastModified(), ]; }3. options 數(shù)組鍵值
阿里云 OSS 中不支持原生的文件夾,而是使用一個(gè) 0 字節(jié)的末尾為 / 的文件起到文件夾功能。
$options 數(shù)組有四個(gè)鍵值對(duì),其中
prefix 是我們想獲取的文件的目錄,如 test/ 即為列出目錄 test 下的所有文件及子文件夾(不遞歸獲取);
delimiter 為行使文件夾功能的分割符號(hào),如 /;
max-keys 是限定返回的文件和文件夾數(shù)目,這里不是指每次最多返回 max-keys 值的數(shù)據(jù),而是以這個(gè)值為分頁(yè)的單頁(yè)容量。如文件夾下有 100 個(gè)文件,這里設(shè)定 max-keys 為 30,則執(zhí)行后的返回結(jié)果為:["30 個(gè) ObjectInfo 對(duì)象", "30 個(gè) ObjectInfo 對(duì)象", "30 個(gè) ObjectInfo 對(duì)象", "10 個(gè) ObjectInfo 對(duì)象"];
marker 是實(shí)現(xiàn)分頁(yè)時(shí)指向下一分頁(yè)起始位置的標(biāo)識(shí)。
4. 總結(jié)我們可以改寫獲取文件列表的方法,使其能夠返回一個(gè)格式合適的數(shù)組:
public function fileList($dir, $maxKey = 30, $delimiter = "/", $nextMarker = "") { $fileList = []; // 獲取的文件列表, 數(shù)組的一階表示分頁(yè)結(jié)果 $dirList = []; // 獲取的目錄列表, 數(shù)組的一階表示分頁(yè)結(jié)果 $storageList = [ "file" => [], // 真正的文件數(shù)組 "dir" => [], // 真正的目錄數(shù)組 ]; while (true) { $options = [ "delimiter" => $delimiter, "prefix" => $dir, "max-keys" => $maxKey, "marker" => $nextMarker, ]; try { $fileListInfo = $this->ossClient->listObjects($this->bucket, $options); // 得到nextMarker, 從上一次 listObjects 讀到的最后一個(gè)文件的下一個(gè)文件開始繼續(xù)獲取文件列表, 類似分頁(yè) } catch (OssException $e) { return $this->send($this->errorCode, $e->getMessage()); // 發(fā)送錯(cuò)誤信息 } $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); // 發(fā)送正確信息 }
執(zhí)行這一方法可以返回一個(gè) json,格式如下:
{ "status": 200, "message": { "file": [ { "name": "robotac2016/_ide_helper.php", "size": 382295, "update_at": "2016-09-20T13:45:04.000Z" }, { "name": "robotac2016/test.php", "size": 11, "update_at": "2016-09-20T12:06:36.000Z" } ], "dir": [ { "dir": "robotac2016/innocence/" } ] } }5. 備忘
若想獲取某一 Bucket 下的所有文件和文件夾,應(yīng)該傳入的 $prefix 值為空字符串 "" 而不是根目錄符號(hào) /,因?yàn)榘⒗镌?OSS 本身沒(méi)有文件夾概念,傳入 / 后系統(tǒng)會(huì)尋找根目錄下所有首字母為 / 的文件,而不是遍歷根目錄本身;
是在阿里云 OSS 中,刪除文件、創(chuàng)建文件操作中若刪除的文件不存在或者創(chuàng)建的文件已存在時(shí),OSS 不會(huì)返回錯(cuò)誤提示,而是靜默或替換同名文件。個(gè)人認(rèn)為刪除操作的執(zhí)行準(zhǔn)則是使得 OSS 中不具有某一文件而不是刪掉它,而創(chuàng)建文件的原則是靜默替換。所以在執(zhí)行這些操作的時(shí)候,應(yīng)該實(shí)現(xiàn)檢測(cè)該文件是否存在以免造成不可恢復(fù)的損失。
使用 RAM 訪問(wèn)控制對(duì) OSS 進(jìn)行權(quán)限管理的時(shí)候,如果使用自定義的權(quán)限策略,該策略只會(huì)在使用 SDK 或 API 的時(shí)候體現(xiàn)。如現(xiàn)在自定義一個(gè)讀寫 OSS 下某一 Bucket 的權(quán)限策略,這一策略在 SDK 中是可以正常起到限制作用的,而在 RAM 控制臺(tái)中,卻被提示沒(méi)有 OSS 的訪問(wèn)權(quán)限。猜測(cè)可能是阿里云 OSS 服務(wù)對(duì)控制臺(tái)下的權(quán)限管理還是以服務(wù)為單位,目前還沒(méi)有把權(quán)限精確到 OSS 的單個(gè) Bucket 中。
{ "Statement": [ { "Action": "oss:*", "Effect": "Allow", "Resource": [ "acs:oss:*:*:oss-test", "acs:oss:*:*:oss-test/*" ] } ], "Version": "1" }
2016.9.22 更新
關(guān)于備忘第二點(diǎn)中 RAM 訪問(wèn)控制的問(wèn)題,我提交了一份工單給 OSS,得到的反饋是,如果想要在 RAM 控制臺(tái)中以圖形化界面訪問(wèn) Bucket,需要在 Statement 中再添加一個(gè)策略,其 Action 值為 ListBuckets,多帶帶給出一個(gè) * 權(quán)限是不夠的,如下:
{ "Statement": [ // 策略 1:用于 api 權(quán)限限制 { "Action": "oss:*", "Effect": "Allow", "Resource": [ "acs:oss:*:*:oss-test", "acs:oss:*:*:oss-test/*" ] }, // 策略 2:用于 RAM 控制臺(tái)顯示 Bucket 列表 { "Action": [ "oss:ListBuckets" ], "Effect": "Allow", "Resource": [ "acs:oss:*:*:*" ] } ], "Version": "1" }
在 ListBuckets 這一策略中,Resource 值只能是 acs:oss:*:*:* 而不能是 acs:oss:*:*:oss-test,不然還是會(huì)在 RAM 控制臺(tái)提示沒(méi)有訪問(wèn)權(quán)限。雖然寫成這樣會(huì)使得登錄 RAM 控制臺(tái)的人看到所有的 Buckets,但其對(duì)除 oss-test 之外的 Buckets 是沒(méi)有讀寫權(quán)限的。
6. 參考阿里云訪問(wèn)控制幫助文檔
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/30453.html
摘要:最近在做微信公眾號(hào),需要將圖片上傳至阿里云。利用模塊將圖片寫到內(nèi)存微信多媒體文件文件路徑圖片上傳阿里云結(jié)果上傳文件出錯(cuò)這種方式將圖片暫存在內(nèi)存里面,那如果并發(fā)量很大,是不是內(nèi)存要爆炸了都感覺(jué)還是不可取。 最近在做微信公眾號(hào),需要將圖片上傳至阿里云OSS。在做這個(gè)功能的過(guò)程中,我走了不少?gòu)澛罚瑖L試過(guò)很多種方法,最后終于研究出一種便捷優(yōu)美的方式。現(xiàn)在把這些方法和思路記錄下來(lái),避免遺忘。 一...
對(duì)于網(wǎng)站存儲(chǔ)的需求,大多數(shù)人還是以私有網(wǎng)盤為主,目的是為了可以存儲(chǔ)屬于私人的視頻、文檔、音頻等資料。但是,也有不少的人想要搭建一個(gè)公共的網(wǎng)盤,主要目的是可以方便所有人查看、瀏覽和下載、使用,同時(shí)也提供視頻在線播放,變成影視站點(diǎn)。這樣的公共網(wǎng)盤服務(wù)搭建起來(lái)并不是很復(fù)雜,但是苦于高昂的存儲(chǔ)費(fèi)用,有的人盯上了超大容量且免費(fèi)的網(wǎng)盤服務(wù),例如OneDrive,團(tuán)隊(duì)版甚至可以達(dá)到TB以上,將OneDrive變...
摘要:第一課阿里云相關(guān)概念深化學(xué)習(xí)云服務(wù)器,簡(jiǎn)稱是一種簡(jiǎn)單高效處理能力可彈性伸縮的計(jì)算服務(wù),幫助您快速構(gòu)建更穩(wěn)定安全的應(yīng)用,提升運(yùn)維效率,降低成本,使您更專注于核心業(yè)務(wù)創(chuàng)新。第一課:阿里云相關(guān)概念深化學(xué)習(xí) ECS 云服務(wù)器(Elastic Compute Service,簡(jiǎn)稱 ECS)是一種簡(jiǎn)單高效、處理能力可彈性伸縮的計(jì)算服務(wù),幫助您快速構(gòu)建更穩(wěn)定、安全的應(yīng)用,提升運(yùn)維效率,降低 IT 成本,使...
摘要:筆主很早就開始用阿里云存儲(chǔ)服務(wù)當(dāng)做自己的圖床了。阿里云對(duì)象存儲(chǔ)文檔,本篇文章會(huì)介紹到整合阿里云存儲(chǔ)服務(wù)實(shí)現(xiàn)文件上傳下載以及簡(jiǎn)單的查看。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術(shù)的整合,可能是你遇到的講解最詳細(xì)的學(xué)習(xí)案例,力爭(zhēng)新手也能看懂并且能夠在看完...
閱讀 2618·2021-11-12 10:36
閱讀 2257·2021-08-23 09:47
閱讀 1675·2019-08-30 15:44
閱讀 1399·2019-08-30 14:10
閱讀 2241·2019-08-29 16:52
閱讀 2333·2019-08-29 16:40
閱讀 1581·2019-08-29 16:17
閱讀 2406·2019-08-26 13:21