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

  • 相关阅读:
    第二周:对Java面向对象的特点的基本感受
    第一周学习情况
    插入排序
    快速排序
    vue传值(小demo)
    Vue下简单分页及搜索功能
    js超简单冒泡算法
    vue框架中实现今天昨天前天最近时间
    vue简单的v-for
    ssm web.xml配置解析
  • 原文地址:https://www.cnblogs.com/sien6/p/7118944.html
Copyright © 2011-2022 走看看