共计 2653 个字符,预计需要花费 7 分钟才能阅读完成。
前言:
目前我的项目开发中上传性能很多都是应用云存储,其益处太多这里就不列举了。然而在上传胜利后,有些性能场景下须要对存储桶内的文件进行治理。天然把历史的文件列表展现进去就很有必要了。而后有列表就有分页,云存储又不像本地存储间接读文件夹就能够,所以我想了两种办法来解决。
办法:
- 将上传的文件返回的地址都存到数据库中,取列表就分页的读表返回。
- 应用 OSS 文档的文件列举办法,益处是不必建表等等,所以上面以这种形式演示。
阐明:
Oss 的 SDK 中提供一个办法 listObjects,接管两个参数 ($bucket, $options)。别离示意存储桶名,基本参数集。$options 是个数组,外面又有 $prefix,$delimiter,$nextMarker,$maxkeys,参数形容见如下。
$prefix 是本人在存储桶下寄存文件的文件夹门路,做分页最次要的是 $nextMarker,$maxkeys 这两个参数。一个是文件的终点就相当于分页 start,一个是每次列举的最大个数就相当于 page_size。
思路:
实现这个分页是不带页码下拉式加载,所以不存在能够点击返回上一页,次要从 $nextMarker,$maxkeys 开始。
- getNextMarker() 办法获取上一次列举文件的标识,没有为空窜,有则返回上一次列表最初的那个文件门路。
- 将返回的标识存入缓存中,每次接口申请进来从缓存中读取一下上一次的文件标识。
- 将标识传入 listObjects 办法中 $options 参数的 $nextMarker。就能够以上一次标识为终点列举前面的列表。
- 自定义一参数,如 $page,(为 0,$nextMarker 则不取缓存间接传入空窜标识;下拉时则 page 累加传入缓存标识)。这样就可在接口申请时从最开始列举 Oss 文件。
代码实现:
- 业务接口办法。
/* | |
* 列举专用 (获取图片列表 / 获取文件列表) | |
* @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; | |
} |
- 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; | |
} |
正文完