您的当前位置:首页>全部文章>文章详情

ThinkPHP动态生成zip压缩包文件并下载的解决方案

发表于:2023-08-08 18:17:05浏览:465次TAG: #ThinkPHP #ZIP #PHP #压缩文件 #下载文件

PHP ZipArchive是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP的ZIP扩展已经开启,这里整理个很普通的动态生成zip压缩包文件并下载的示例供参考。

需求:
提供N个文件的路径,文件再打包前需要重新命名,将文件打包压缩成zip文件,并下载。

解决:
无需要下载任何插件,测试环境本地Ngnix和云主机均可。

代码:
访问zip_down方法,需要注意需要打包的文件,也就是$fileArray数组中的路径需要真实的物理路径,比如:

D:\wwwroot\gouguoa\public\public\storage\202308\aaaaa.jpg

具体代码如下:

    //打包文件
    public function create_zip($pathArr,$zipName){
        $zip = new \ZipArchive();
        if($zip->open($zipName,\ZipArchive::CREATE|\ZipArchive::OVERWRITE)){
            foreach($pathArr as $file){
                $path = CMS_ROOT."public".$file['filepath'];
                if(!file_exists($path)){
                    continue;
                }
                $zip->addFile($path,$file['name']);  //向压缩包中添加文件
            }
            $zip->close();
            return ['code'=>0,'info'=>"创建成功",'path'=>$zipName];
        }else{
            return ['code'=>1,'info'=>'创建失败'];
        } 
    }
    //下载文件
    public function zip_down()
    {
         $fileArray = [
            ["name" => "11.png","filepath" => "/storage/202308/0b62e66de379ef4014532b3c7bcbfc38.png"],
            ["name" => "001需求.doc","filepath" => "/storage/202308/34ee09861db8208387812d5.doc" ],
            ["name" => "2903453064-副本.mp4","filepath" =>"/storage/202308/bd4b515310447cdb7029f64f.mp4"]
          ];
            //生成压缩文件名
            $fileName = '我是新的压缩包.zip';
            //前面的读取真实的物理路径
            $zipName = CMS_ROOT."public".'/storage/zip/'.$fileName;
            $res = $this->create_zip($fileArray,$zipName);
           //halt($res);
            if($res['code']==0){
                $fileUrl = $res['path'];
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment; filename="' . $fileName . '"');
                readfile($fileUrl);
                //下载完成后删除文件
                @unlink($fileUrl);
                exit;
            }
            else{
                return to_assign(1, "操作失败");
            }
        }
        else{
            return to_assign(1, "找不到相关附件");
        }
    }

实际效果:
图片alt