阿里云中获取文件及目录列表的方法
Posted 逝火
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里云中获取文件及目录列表的方法相关的知识,希望对你有一定的参考价值。
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\\n"); printf($e->getMessage() . "\\n"); 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
数组有四个键值对,其中
-
prefix
是我们想获取的文件的目录,如test/
即为列出目录test
下的所有文件及子文件夹(不递归获取); -
delimiter
为行使文件夹功能的分割符号,如/
; -
max-keys
是限定返回的文件和文件夹数目,这里不是指每次最多返回max-keys
值的数据,而是以这个值为分页的单页容量。如文件夹下有 100 个文件,这里设定max-keys
为 30,则执行后的返回结果为:[\'30 个 ObjectInfo 对象\', \'30 个 ObjectInfo 对象\', \'30 个 ObjectInfo 对象\', \'10 个 ObjectInfo 对象\']; -
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); // 发送正确信息 }
备忘:
-
若想获取某一 Bucket 下的所有文件和文件夹,应该传入的
$prefix
值为空字符串\'\'
而不是根目录符号/
,因为阿里云 OSS 本身没有文件夹概念,传入/
后系统会寻找根目录下所有首字母为/
的文件,而不是遍历根目录本身; -
是在阿里云 OSS 中,删除文件、创建文件操作中若删除的文件不存在或者创建的文件已存在时,OSS 不会返回错误提示,而是静默或替换同名文件。个人认为删除操作的执行准则是使得 OSS 中不具有某一文件而不是删掉它,而创建文件的原则是静默替换。所以在执行这些操作的时候,应该实现检测该文件是否存在以免造成不可恢复的损失。
参考网址:
https://segmentfault.com/a/1190000006962911?utm_source=tuicool&utm_medium=referral
以上是关于阿里云中获取文件及目录列表的方法的主要内容,如果未能解决你的问题,请参考以下文章