由于官方文档及地址bug了 所以推荐composer下载,文档地址为:https://github.com/vikyd/pclzip-doc-zh-cn
下载:
composer require pclzip/pclzip
由于php7.0以上对时间戳做了int限制所以下载好了之后,去更改 pclzip.lib.php 大概在1788行。如果你是7以下版本则不用修改
$v_memory_limit = trim($v_memory_limit);
改为
$v_memory_limit = intval(trim($v_memory_limit));
压缩或解压中出现的中文乱码问题修改两处
// $p_header['stored_filename'] = $p_filedescr['stored_filename']; 压缩改为下方
$p_header['stored_filename'] = mb_convert_encoding($p_filedescr['stored_filename'],'GB2312','UTF-8');
//解压则需要添加一行代码
$p_entry['filename'] = $p_path . "/" . $p_entry['filename']; // 添加下方代码
$p_entry['filename'] = mb_convert_encoding($p_entry['filename'], 'UTF-8', 'gb2312');
下面以thinkphp5为例子 注意:tp5加载类在windows和linux有致命的区别,一定要有命名空间namespace否则像下面vendor加载只能在windows系统下运行,linux必须require_once引入
/*
* 打包下载
*/
public function download()
{
// 思路:先创建Create个压缩包文件,然后add添加文件并重命名文件名,然后下载该压缩包,最后删除该压缩包
vendor('pclzip.PclZip'); // windows可以这样引入
//require_once VENDOR_PATH .'/pclzip/pclzip/pclzip.lib.php'; //linux引入方式
$zipname = ROOT_PATH . 'public/erweima/test.zip';
$pclzip = new \PclZip($zipname);
// 罗列图片并复制重命名
$files = [ROOT_PATH . 'public/erweima/ewm1.png', ROOT_PATH . 'public/erweima/ewm2.png'];
$newfiles = [ROOT_PATH . 'public/erweima/1.png', ROOT_PATH . 'public/erweima/2.png'];
for ($i = 0; $i < count($files); $i++) {
copy($files[$i], $newfiles[$i]);
}
// 添加文件进压缩包
$rs = $pclzip->create($newfiles, PCLZIP_OPT_REMOVE_ALL_PATH);
// 下载文件及删除文件和copy的图片
if (file_exists(ROOT_PATH . 'public/erweima/')) {
//以只读和二进制模式打开文件
$file = fopen ( $zipname, "rb" );
//告诉浏览器这是一个文件流格式的文件
Header ( "Content-type: application/octet-stream" );
//请求范围的度量单位
Header ( "Accept-Ranges: bytes" );
//Content-Length是指定包含于请求或响应中数据的字节长度
Header ( "Accept-Length: " . filesize ( $zipname ) );
//用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
Header ( "Content-Disposition: attachment; filename=test.zip" );
//读取文件内容并直接输出到浏览器
echo fread ( $file, filesize ( $zipname ) );
fclose ( $file );
for ($i = 0; $i < count($files); $i++) {
unlink($newfiles[$i]);
}
unlink($zipname);
exit ();
}
if (!$rs) {
die('Error:'.$pclzip->errorInfo());
}
}
直接在浏览器中输入你的function地址即可,例子只是简单地打包下载,更复杂的需要自己完善。
有疑问可以留言问我,欢迎留言共同商讨