`

php压缩zip文件(多级目录,自定义目录名)

    博客分类:
  • php
阅读更多

利用php的ZipArchive可以对文件进行打包,我这里包装了一个函数,传入数组,即可打包,数组的定义方式为:对于数组的每一个元素,当元素为数组时,键名为目录,否则就是将所有的字符串当做相对路径,将文件添加到压缩包的当前路径下,代码贴出来,附件中有可运行版本。

这里要再提一下的是,如果传入比如$list = array('file1' => './1.txt', 'file2' => './2.txt');这里的file1,file2作为键名毫无意义,并不会为之创建目录,因为值是一个字符串,所以压缩包的根目录里包含了1.txt, 2.txt,如果要将1.txt放入file1目录,2.txt放入file2目录,那么应该写参数为:

$list = array('list1' => array('./1.txt', './2.txt')),之所以这样方式实现,是因为考虑问题简单多了,只要值是数组,就创建目录,只要值不是数字,就必须是字符串,那么就直接添加文件到压缩包的当前路径下。当前路径则随着目录的创建逐层递归。

 

<?php
$wwwDIR = $_SERVER['DOCUMENT_ROOT'];
$datalist = array(
	'testzip' => array(
		"./1.txt",
		'tmp' => array(
			"./2.txt",
			"./3.txt",
		),
	),
);
$filename = zipArrayFiles($datalist, $wwwDIR);
if ($filename) {
	header("Cache-Control: public");
	header("Content-Description: File Transfer");
	header('Content-disposition: attachment; filename=' . basename($filename)); //文件名
	header("Content-Type: application/zip"); //zip格式的
	header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
	header('Content-Length: ' . filesize($filename)); //告诉浏览器,文件大小
	@readfile($filename);
}
function zipArrayFiles($datalist, $outDir) {
	function _zipArrayFiles($datalist, $zip, $basePath = '') {
		foreach ($datalist as $dirname => $path) {
			if (!is_array($path)) {
				$zipPathName = $basePath ? $basePath . '/' . basename($path) : basename($path);
				$result = $zip->addFile($path, $zipPathName);
				if (false === $result) {
					return false;
				}
			} else {
				$zipDirName = $basePath ? $basePath . '/' . $dirname : $dirname;
				$result = $zip->addEmptyDir($zipDirName);
				if (false === $result) {
					return false;
				}
				$result = _zipArrayFiles($path, $zip, $zipDirName);
				if (false === $result) {
					return false;
				}
			}
		}
		return true;
	}
	$md5sum = md5(serialize($datalist));
	$filename = $outDir . '/' . $md5sum . '.zip';
	if (file_exists($filename)) {
		return $filename;
	}
	$zip = new ZipArchive;
	if ($zip->open($filename, ZIPARCHIVE::CREATE) !== TRUE) {
		return false;
	}
	$result = _zipArrayFiles($datalist, $zip);
	if (false === $result) {
		$zip->unchangeAll();
		return false;
	}
	$zip->close();
	return $filename;
}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics