前言:

目前我的项目开发中上传性能很多都是应用云存储,其益处太多这里就不列举了。然而在上传胜利后,有些性能场景下须要对存储桶内的文件进行治理。天然把历史的文件列表展现进去就很有必要了。而后有列表就有分页,云存储又不像本地存储间接读文件夹就能够,所以我想了两种办法来解决。 

办法:

  1. 将上传的文件返回的地址都存到数据库中,取列表就分页的读表返回。
  2. 应用OSS文档的文件列举办法,益处是不必建表等等,所以上面以这种形式演示。

阐明:

Oss的SDK中提供一个办法listObjects,接管两个参数($bucket, $options)。别离示意存储桶名,基本参数集。$options是个数组,外面又有$prefix,$delimiter,$nextMarker,$maxkeys,参数形容见如下。


$prefix是本人在存储桶下寄存文件的文件夹门路,做分页最次要的是$nextMarker,$maxkeys这两个参数。一个是文件的终点就相当于分页start,一个是每次列举的最大个数就相当于page_size。 

思路:

实现这个分页是不带页码下拉式加载,所以不存在能够点击返回上一页,次要从$nextMarker,$maxkeys开始。   

  1. getNextMarker()办法获取上一次列举文件的标识,没有为空窜,有则返回上一次列表最初的那个文件门路。   
  2. 将返回的标识存入缓存中,每次接口申请进来从缓存中读取一下上一次的文件标识。   
  3. 将标识传入listObjects办法中$options参数的$nextMarker。就能够以上一次标识为终点列举前面的列表。   
  4. 自定义一参数,如$page,(为0,$nextMarker则不取缓存间接传入空窜标识;下拉时则page累加传入缓存标识)。这样就可在接口申请时从最开始列举Oss文件。 

代码实现:

  1. 业务接口办法。
/*     * 列举专用(获取图片列表/获取文件列表)     * @access private     * @return array     * */    private function getList($page = 0 , $dirname)    {        list($proctol,$domain) = explode("//", $this->oss->config['EndPoint']);         // Oss对外域名        /*获取配置项分页页码,判断页数*/        if (!empty($this->ueconfig) && is_array($this->ueconfig)) {            $pageSize = 20;        }                // 文件终点标识        $marker = "";        if($page > 0) {            $marker = Cache::store('redis')->get($this->config['bucket']."-".$dirname."maker");        }                // 获取配置文件中的页码        $pageSize = $this->ueconfig['imageManagerListSize'];        //$pageSize = 2;                // 调用封装的Oss文件列举办法        $res = $this->oss->listBuckets($this->config['bucket'],$dirname,$pageSize,$marker);        $ret = [];        if($res['code'] == 1) {            foreach ($res['data']['obj']->getObjectList() as $key => $value) {                //$ret[] = $proctol."//".$this->config['bucket'].".".$domain."/".$value->getKey();                array_unshift($ret,$proctol."//".$this->config['bucket'].".".$domain."/".$value->getKey());            }            if(!$res['data']['next_marker']) {                $marker = explode(".com/",$ret[0])[1];            } else {                $marker = $res['data']['next_marker'];            }            // 标识存入缓存            Cache::store('redis')->set($this->config['bucket']."-".$dirname."maker",$marker);        }        return $ret;    }
  1. Oss文件列举封装办法。
/*     * 列举文件     * @access public     * @add: bqs     * @praam: string $bucket 存储桶名     * @param: string $prefix 文件门路     * @param: int $page 开始页     * @param: int $maker 分页标识     * @return: array     * */    public function listBuckets($bucket = "hhbusiness", $prefix = "", $pagesize = 20, $maker = "")    {        $config = $this->config;        $res['code'] = 1;        $res['message'] = '';        $res['data'] = "";        try {            $ossClient = new OssClient($config['AccessKeyID'], $config['AccessKeySecret'], $config['EndPoint']);            //$prefix = 'article/uploadimage/';            $delimiter = '/';            $nextMarker = "";            //$maxkeys = 1;            $options = array(                'delimiter' => $delimiter,                'prefix' => $prefix,                'max-keys' => $pagesize,                'marker' => $maker,            );            $result['obj'] = $ossClient->listObjects($bucket, $options);            $result['next_marker'] = $result['obj']->getNextMarker();            // 没有值            if ($result['obj']->getIsTruncated() !== "true") {                //break;            }            $res['code'] = 1;            $res['data'] = $result;        } catch (OssException $e) {            $res['code'] = 0;            $res['message'] = $e->getMessage();        }        return $res;    }