Thinkphp3.2 压缩文件、解压文件,保持原层级关系


	/* * 
	 * * 生成zip压缩文件
	 * * $sourceDir:被压缩的文件夹或文件
	 * * $outFileName:输出的压缩文件名称
	 * * $zlj 被压缩的文件夹或文件的顶级父路径,如压缩文件夹D:/www/cc   则为D:/www/cc
	 * */
	public function createZipResources($sourceDir, $outFileName = '',$zlj='')
	{
		if ($outFileName == '') {
			$outFileName = time().'.zip';
		} else {
			$outFileName = $outFileName.'.zip';
		}

		$fileNames = [];

		//判断需要被压缩的目标是文件还是文件夹
		if (is_file($sourceDir)) {
			$fileNames['file'][basename($sourceDir)] = $sourceDir;
		} 

		if (!array_key_exists('file', $fileNames) && !array_key_exists('dir', $fileNames)) {
			$fileNames['dir'][str_replace($zlj.'/', "", $folderName)] = [];
		}

		// 生成文件
		$zip = new \ZipArchive (); // 使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
		if ($zip->open ($outFileName, \ZIPARCHIVE::CREATE ) !== TRUE) {
			exit ( '无法打开文件,或者文件创建失败' );
		}
		$fileNameArr = $fileNames;
		$toFolderZip = function ($fileNameArr,$zip, $zlj){
			foreach ( $fileNameArr as $key => $value ) {
				if ($key == 'file') {
					foreach ($value as $fileName => $filePath) {
						$fileName = urldecode($fileName);
						$xlj=str_replace($zlj.'/', "", $filePath);
						$zip->addFile($filePath, $xlj);
					}
				}
				if ($key == 'dir') {
					foreach ($value as $folderName => $folderObject) {
						$folderName = urldecode($folderName);
						$xlj=str_replace($zlj.'/', "", $folderName);
						$zip->addEmptyDir($xlj);
					}
				}

			}
		};
		$toFolderZip($fileNameArr, $zip, $zlj);
		$zip->close(); // 关闭
	}
	/* *
	 * * 压缩当前目录的所有文件----多个文件直接压缩不需要保留原目录,可循环使用当前方法压缩每个文件,不要文件夹
	 * * $str  要压缩的绝对路径如:'E:/phpstudy_pro/WWW/ceshi/data/cs'
	 * * $outFileName 要压缩为的压缩包名
	 * * $one 是否为要压缩的文件夹的根目录 如压缩'E:/phpstudy_pro/WWW/ceshi/data/cs' 则第一次调用 为根目录,$one 为false 如果直接对根目录下的文件和文件夹压缩 $one 为true
	 * * $zlj 被压缩的文件夹或文件的顶级父路径,如压缩文件夹D:/www/cc   则为D:/www/cc
	 * */
	public function ys_file($str,$outFileName,$one=false,$zlj='') {
		if(!is_file($str)){
			$fileNames = scandir($str);
			foreach($fileNames as $ks=>$vs){
				if(!in_array($vs,['.','..'])){
					$one && $this->createZipResources($str,$outFileName,$zlj);
					$this->ys_file($str.'/'.$vs,$outFileName,true,$zlj);
				}
			}
		}else{
			$this->createZipResources($str,$outFileName,$zlj);
		}
	}
	/* *
	 * * 解压当前zip文件到当前目录
	 * */
	public function jy_file($file){
		$zip = new \ZipArchive;
		if ($zip->open($file) === TRUE) {//中文文件名要使用ANSI编码的文件格式
		  $zip->extractTo(dirname($file));//提取全部文件到当前目录
		  //$zip->extractTo('/my/destination/dir/', array('pear_item.gif', 'testfromfile.php'));//提取部分文件
		  $zip->close();
		  return 1;
		} else {
		  return 0;
		}
	}
	//测试压缩文件,解压缩文件
	public function test_jys()
	{
		//压缩文件
		$basePath = 'E:/phpstudy_pro/WWW/ceshi/data/cs';//只能用绝对路径
		$zipName = $basePath.'/cs';
		$this->ys_file($basePath, $zipName, false,$basePath);
		//解压文件到当前目录
		$basePath = 'E:/phpstudy_pro/WWW/ceshi/data/cs/qin.zip';//只能用绝对路径
		$this->jy_file($basePath);
	}

你可能感兴趣的:(php,zip,thinkphp,linux)