zoukankan      html  css  js  c++  java
  • 阿里云中获取文件及目录列表的方法

    1 获取指定bucket下的文件列表(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读到的最后一个文件的下一个文件开始继续获取文件列表
            $nextMarker = $listObjectInfo->getNextMarker();
            $listObject = $listObjectInfo->getObjectList();
            $listPrefix = $listObjectInfo->getPrefixList();
            var_dump($listObject); // 这里手册中写的是输出 count($listObject),以下同理
            var_dump($listPrefix);
            if ($nextMarker === '') {
                break;
            }
        }

    2 执行以上结果你会发现无法得到自己想要的结果,返回的是对象数据(此外,option在其中的作用)

    3 分析结果:

    通过查看 var_dump 输出信息,可以发现执行结果为 OSSModelObjectInfo 对象和 OSSModelPrefixInfo 对象,分别对应 var_dump($listObject) 和 var_dump($listPrefix)

    查看php-sdk代码,会发现

    其中包含了这些方法,供我们获取指定属性

    4 options  数组数值

    $options 数组有四个键值对,其中

    1. prefix 是我们想获取的文件的目录,如 test/ 即为列出目录 test 下的所有文件及子文件夹(不递归获取);

    2. delimiter 为行使文件夹功能的分割符号,如 /

    3. max-keys 是限定返回的文件和文件夹数目,这里不是指每次最多返回 max-keys 值的数据,而是以这个值为分页的单页容量。如文件夹下有 100 个文件,这里设定 max-keys 为 30,则执行后的返回结果为:['30 个 ObjectInfo 对象', '30 个 ObjectInfo 对象', '30 个 ObjectInfo 对象', '10 个 ObjectInfo 对象'];

    4. marker 是实现分页时指向下一分页起始位置的标识。

    注:阿里云 OSS 中不支持原生的文件夹,而是使用一个 0 字节的末尾为 / 的文件起到文件夹功能

    5 总结:

    改写获取文件列表的方法,使其能够返回一个格式合适的数组:

    public function fileList($dir, $maxKey = 30, $delimiter = '/', $nextMarker = '') {
            $fileList = []; // 获取的文件列表, 数组的一阶表示分页结果
            $dirList = []; // 获取的目录列表, 数组的一阶表示分页结果
            $storageList = [
                'file' => [], // 真正的文件数组
                'dir'  => [], // 真正的目录数组
            ];
            while (true) {
                $options = [
                    'delimiter' => $delimiter,
                    'prefix'    => $dir,
                    'max-keys'  => $maxKey,
                    'marker'    => $nextMarker,
                ];
                try {
                    $fileListInfo = $this->ossClient->listObjects($this->bucket, $options);
                    // 得到nextMarker, 从上一次 listObjects 读到的最后一个文件的下一个文件开始继续获取文件列表, 类似分页
                } catch (OssException $e) {
                    return $this->send($this->errorCode, $e->getMessage()); // 发送错误信息
                }
                $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); // 发送正确信息
        }

    备忘:

    1. 若想获取某一 Bucket 下的所有文件和文件夹,应该传入的 $prefix 值为空字符串 '' 而不是根目录符号 /,因为阿里云 OSS 本身没有文件夹概念,传入 / 后系统会寻找根目录下所有首字母为 / 的文件,而不是遍历根目录本身;

    2. 是在阿里云 OSS 中,删除文件、创建文件操作中若删除的文件不存在或者创建的文件已存在时,OSS 不会返回错误提示,而是静默或替换同名文件。个人认为删除操作的执行准则是使得 OSS 中不具有某一文件而不是删掉它,而创建文件的原则是静默替换。所以在执行这些操作的时候,应该实现检测该文件是否存在以免造成不可恢复的损失。

    参考网址:

    https://segmentfault.com/a/1190000006962911?utm_source=tuicool&utm_medium=referral

  • 相关阅读:
    【算法学习笔记】76.DFS 回溯检测 SJTU OJ 1229 mine
    【算法学习笔记】75. 动态规划 棋盘型 期望计算 1390 畅畅的牙签盒(改)
    【算法学习笔记】74. 枚举 状态压缩 填充方案 SJTU OJ 1391 畅畅的牙签袋(改)
    【算法学习笔记】73.数学规律题 SJTU OJ 1058 小M的机器人
    【算法学习笔记】72.LCS 最大公公子序列 动态规划 SJTU OJ 1065 小M的生物实验1
    【算法学习笔记】71.动态规划 双重条件 SJTU OJ 1124 我把助教团的平均智商拉低了
    【算法学习笔记】70.回文序列 动态规划 SJTU OJ 1066 小M家的牛们
    【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks
    【算法学习笔记】68.枚举 SJTU OJ 1272 写数游戏
    【算法学习笔记】67.状态压缩 DP SJTU OJ 1383 畅畅的牙签袋
  • 原文地址:https://www.cnblogs.com/sien6/p/7118944.html
Copyright © 2011-2022 走看看