php实现阿里云OSS下载目录文件并打包

php实现阿里云OSS下载目录文件并打包

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;
        }


{{collectdata}}

网友评论0