亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

阿里云 OSS 中獲取文件列表的方法

Zoom / 2186人閱讀

摘要:猜測可能是阿里云服務對控制臺下的權限管理還是以服務為單位,目前還沒有把權限精確到的單個中。參考阿里云訪問控制幫助文檔

1. 問題

OSS PHP-SDK 手冊中給出使用 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讀到的最后一個文件的下一個文件開始繼續(xù)獲取文件列表
        $nextMarker = $listObjectInfo->getNextMarker();
        $listObject = $listObjectInfo->getObjectList();
        $listPrefix = $listObjectInfo->getPrefixList();
        var_dump($listObject); // 這里手冊中寫的是輸出 count($listObject),以下同理
        var_dump($listPrefix);
        if ($nextMarker === "") {
            break;
        }
    }

這段代碼的執(zhí)行結果并沒有返回我最開始想象中的文件名稱、大小之類的數(shù)組,而是在瀏覽器輸出了一些對象,那么這里該如何轉換成我們需要的數(shù)據(jù)格式呢?此外,$options 數(shù)組中的 delimiter,marker 鍵值對到底有什么作用呢?

2. 返回值

通過查看 var_dump 輸出信息,可以發(fā)現(xiàn)執(zhí)行結果為 OSSModelObjectInfo 對象和 OSSModelPrefixInfo 對象,分別對應 var_dump($listObject)var_dump($listPrefix)。
通過查看 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 中不支持原生的文件夾,而是使用一個 0 字節(jié)的末尾為 / 的文件起到文件夾功能。

$options 數(shù)組有四個鍵值對,其中

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

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

max-keys 是限定返回的文件和文件夾數(shù)目,這里不是指每次最多返回 max-keys 值的數(shù)據(jù),而是以這個值為分頁的單頁容量。如文件夾下有 100 個文件,這里設定 max-keys 為 30,則執(zhí)行后的返回結果為:["30 個 ObjectInfo 對象", "30 個 ObjectInfo 對象", "30 個 ObjectInfo 對象", "10 個 ObjectInfo 對象"];

marker 是實現(xiàn)分頁時指向下一分頁起始位置的標識。

4. 總結

我們可以改寫獲取文件列表的方法,使其能夠返回一個格式合適的數(shù)組:

    public function fileList($dir, $maxKey = 30, $delimiter = "/", $nextMarker = "") {
        $fileList = []; // 獲取的文件列表, 數(shù)組的一階表示分頁結果
        $dirList = []; // 獲取的目錄列表, 數(shù)組的一階表示分頁結果
        $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 讀到的最后一個文件的下一個文件開始繼續(xù)獲取文件列表, 類似分頁
            } catch (OssException $e) {
                return $this->send($this->errorCode, $e->getMessage()); // 發(fā)送錯誤信息
            }
            $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í)行這一方法可以返回一個 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 下的所有文件和文件夾,應該傳入的 $prefix 值為空字符串 "" 而不是根目錄符號 /,因為阿里云 OSS 本身沒有文件夾概念,傳入 / 后系統(tǒng)會尋找根目錄下所有首字母為 / 的文件,而不是遍歷根目錄本身;

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

使用 RAM 訪問控制對 OSS 進行權限管理的時候,如果使用自定義的權限策略,該策略只會在使用 SDK 或 API 的時候體現(xiàn)。如現(xiàn)在自定義一個讀寫 OSS 下某一 Bucket 的權限策略,這一策略在 SDK 中是可以正常起到限制作用的,而在 RAM 控制臺中,卻被提示沒有 OSS 的訪問權限。猜測可能是阿里云 OSS 服務對控制臺下的權限管理還是以服務為單位,目前還沒有把權限精確到 OSS 的單個 Bucket 中。

    {
      "Statement": [
        {
          "Action": "oss:*",
          "Effect": "Allow",
          "Resource": [
            "acs:oss:*:*:oss-test",
            "acs:oss:*:*:oss-test/*"
          ]
        }
      ],
      "Version": "1"
    }

2016.9.22 更新

關于備忘第二點中 RAM 訪問控制的問題,我提交了一份工單給 OSS,得到的反饋是,如果想要在 RAM 控制臺中以圖形化界面訪問 Bucket,需要在 Statement 中再添加一個策略,其 Action 值為 ListBuckets,多帶帶給出一個 * 權限是不夠的,如下:

    {
      "Statement": [
        // 策略 1:用于 api 權限限制
        {
          "Action": "oss:*",
          "Effect": "Allow",
          "Resource": [
            "acs:oss:*:*:oss-test",
            "acs:oss:*:*:oss-test/*"
          ]
        },
        // 策略 2:用于 RAM 控制臺顯示 Bucket 列表
        {
          "Action": [
            "oss:ListBuckets"
          ],
          "Effect": "Allow",
          "Resource": [
            "acs:oss:*:*:*"
          ]
        }
      ],
      "Version": "1"
    }

ListBuckets 這一策略中,Resource 值只能是 acs:oss:*:*:* 而不能是 acs:oss:*:*:oss-test,不然還是會在 RAM 控制臺提示沒有訪問權限。雖然寫成這樣會使得登錄 RAM 控制臺的人看到所有的 Buckets,但其對除 oss-test 之外的 Buckets 是沒有讀寫權限的。

6. 參考

阿里云訪問控制幫助文檔

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/30453.html

相關文章

  • 微信公眾號圖片上傳至阿里OSS

    摘要:最近在做微信公眾號,需要將圖片上傳至阿里云。利用模塊將圖片寫到內存微信多媒體文件文件路徑圖片上傳阿里云結果上傳文件出錯這種方式將圖片暫存在內存里面,那如果并發(fā)量很大,是不是內存要爆炸了都感覺還是不可取。 最近在做微信公眾號,需要將圖片上傳至阿里云OSS。在做這個功能的過程中,我走了不少彎路,嘗試過很多種方法,最后終于研究出一種便捷優(yōu)美的方式。現(xiàn)在把這些方法和思路記錄下來,避免遺忘。 一...

    whatsns 評論0 收藏0
  • ZFile自建免費公共網(wǎng)盤服務-支持阿里OSS,OneDrive,FTP,S3協(xié)議等存儲

    對于網(wǎng)站存儲的需求,大多數(shù)人還是以私有網(wǎng)盤為主,目的是為了可以存儲屬于私人的視頻、文檔、音頻等資料。但是,也有不少的人想要搭建一個公共的網(wǎng)盤,主要目的是可以方便所有人查看、瀏覽和下載、使用,同時也提供視頻在線播放,變成影視站點。這樣的公共網(wǎng)盤服務搭建起來并不是很復雜,但是苦于高昂的存儲費用,有的人盯上了超大容量且免費的網(wǎng)盤服務,例如OneDrive,團隊版甚至可以達到TB以上,將OneDrive變...

    番茄西紅柿 評論0 收藏2637
  • ACE認證考試—阿里產(chǎn)品概念深化學習

    摘要:第一課阿里云相關概念深化學習云服務器,簡稱是一種簡單高效處理能力可彈性伸縮的計算服務,幫助您快速構建更穩(wěn)定安全的應用,提升運維效率,降低成本,使您更專注于核心業(yè)務創(chuàng)新。第一課:阿里云相關概念深化學習 ECS 云服務器(Elastic Compute Service,簡稱 ECS)是一種簡單高效、處理能力可彈性伸縮的計算服務,幫助您快速構建更穩(wěn)定、安全的應用,提升運維效率,降低 IT 成本,使...

    zhichangterry 評論0 收藏0
  • SpringBoot 整合 阿里OSS 存儲服務,快來免費搭建一個自己圖床

    摘要:筆主很早就開始用阿里云存儲服務當做自己的圖床了。阿里云對象存儲文檔,本篇文章會介紹到整合阿里云存儲服務實現(xiàn)文件上傳下載以及簡單的查看。 Github 地址:https://github.com/Snailclimb/springboot-integration-examples(SpringBoot和其他常用技術的整合,可能是你遇到的講解最詳細的學習案例,力爭新手也能看懂并且能夠在看完...

    鄒強 評論0 收藏0

發(fā)表評論

0條評論

Zoom

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<