php 利用pclzip压缩文件并下载

    科技2024-10-17  20

    由于官方文档及地址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地址即可,例子只是简单地打包下载,更复杂的需要自己完善。

    有疑问可以留言问我,欢迎留言共同商讨

    Processed: 0.041, SQL: 8