php实现阿里云OSS下载目录文件并打包
阿里云OSS很方便,官方提供乐api也很强大,但是无法满足特别的需求,比方说批量下载阿里云OSS的多个文件及目录,批量打包目录等,这些功能需要使用一些基础的api进行开发
在阿里云OSS中目录就是Object,下载目录必须要查看目录有哪些文件
利用官方自带的listObjects这个api可以实现查看目录文件及子目录的功能
ossClient->listObjects($bucket, array( 'max-keys' => "1000",//设置分页的页容量 'prefix' => "img/2019/8/12/",//指定下一级文件 'delimiter' => "/",//跳出递归循环,只去指定目录下的文件。使用它时 prefix要以/结尾 'marker' => ""//获取下一页的起始点,它的下一项 ));通过上面这个api可以获取分页大小下的目录文件路径
获取路径后就可以调用阿里云OSS的下载对象接口getObject了
try { $_content = $this->ossClient->getObject($bucket, $object); $_localpath = dirname($localfilepath);//本地路径 if (! is_dir($_localpath)) { mkdir($_localpath, 0777, true); } return file_put_contents($localfilepath, $_content); } catch (\Plugin\OSS\Core\OssException $e) { print $e->getMessage(); return false; }下载完后既可以打包了
/*压缩多级目录 $openFile:目录句柄 $zipObj:Zip对象 $sourceAbso:源文件夹路径 */ function createZip($openFile,$zipObj,$sourceAbso,$newRelat = '') { while(($file = readdir($openFile)) != false) { if($file=="." || $file=="..") continue; /*源目录路径(绝对路径)*/ $sourceTemp = $sourceAbso.'/'.$file; /*目标目录路径(相对路径)*/ $newTemp = $newRelat==''?$file:$newRelat.'/'.$file; if(is_dir($sourceTemp)) { //echo '创建'.$newTemp.'文件夹<br/>'; $zipObj->addEmptyDir($newTemp);/*这里注意:php只需传递一个文件夹名称路径即可*/ $this->createZip(opendir($sourceTemp),$zipObj,$sourceTemp,$newTemp); } if(is_file($sourceTemp)) { //echo '创建'.$newTemp.'文件<br/>'; $zipObj->addFile($sourceTemp,$newTemp); }
ok,完整的功能如下
$this->accessKeyId = $accessKeyId; $this->accessKeySecret = $accessKeySecret; $this->endpoint = $endpoint; try { $this->ossClient = new \Plugin\OSS\OssClient($this->accessKeyId, $this->accessKeySecret, $this->endpoint); } catch (\Plugin\OSS\Core\OssException $e) { print $e->getMessage(); } try { $_marker = ""; $_filelist = []; $_delimiter = $_onlyfile ? "/" : ""; if ($_onlyfile) { // 只要目录下文件的话,就要加上/ if (substr($path, - 1) != "/") { $path .= "/"; } } else { if (substr($path, - 1) == "/") { // 如果子目录也要下载,就要把最后面的/去掉 $path = substr($path, 0, strlen($path) - 1); } } while (true) { $_result = $this->ossClient->listObjects($bucket, array( 'max-keys' => "1000", 'prefix' => $path, 'delimiter' => $_delimiter, 'marker' => $_marker )); foreach ($_result->getObjectList() as $item) { $_filelist[] = $item->getKey(); } $_marker = $_result->getNextMarker(); $_hasdata=$_result->getIsTruncated(); if ($_hasdata=="false") { break; } } return $_filelist; } catch (\Plugin\OSS\Core\OssException $e) { print $e->getMessage(); return false; }
网友评论0