国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

Zoom / 1983人閱讀

摘要:猜測(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ù)組中的 delimitermarker 鍵值對(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

相關(guān)文章

  • 微信公眾號(hào)圖片上傳至阿里OSS

    摘要:最近在做微信公眾號(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),避免遺忘。 一...

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

    對(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變...

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

    摘要:第一課阿里云相關(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 成本,使...

    zhichangterry 評(píng)論0 收藏0
  • SpringBoot 整合 阿里OSS 存儲(chǔ)服務(wù),快來(lái)免費(fèi)搭建一個(gè)自己圖床

    摘要:筆主很早就開始用阿里云存儲(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)新手也能看懂并且能夠在看完...

    鄒強(qiáng) 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<