当前位置: 首页 > 工具软件 > PclZip > 使用案例 >

php 利用pclzip压缩文件并下载

聂奇
2023-12-01

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

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

 类似资料: