thinkphp 批量打包下载文件

  • 内容
  • 相关
function zip(){  
        $files = array('./data/upload/file/20171205/5a26574611321.xlsx');    
        $zipName = './download.zip';  
        $zip = new \ZipArchive;//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释  
        /* 
         * 通过ZipArchive的对象处理zip文件 
         * $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE 
         * $zip->open这个方法第一个参数表示处理的zip文件名。 
         * 这里重点说下第二个参数,它表示处理模式 
         * ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。 
         * ZIPARCHIVE::CREATE 如果不存在则创建一个zip压缩包,若存在系统就会往原来的zip文件里添加内容。 
         * 
         * 这里不得不说一个大坑。 
         * 我的应用场景是需要每次都是创建一个新的压缩包,如果之前存在,则直接覆盖,不要追加 
         * so,根据官方文档和参考其他代码,$zip->open的第二个参数我应该用 ZipArchive::OVERWRITE 
         * 问题来了,当这个压缩包不存在的时候,会报错:ZipArchive::addFile(): Invalid or uninitialized Zip object 
         * 也就是说,通过我的测试发现,ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效 
         * 所以我的解决方案是 $zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE) 
         * 
         * 以上总结基于我当前的运行环境来说 
         * */  
        if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) {  
            exit('无法打开文件,或者文件创建失败');  
        }  
        foreach($files as $val){  
            //$attachfile = $attachmentDir . $val['filepath']; //获取原始文件路径  
            if(file_exists($val)){  
                //addFile函数首个参数如果带有路径,则压缩的文件里包含的是带有路径的文件压缩  
                //若不希望带有路径,则需要该函数的第二个参数  
                $zip->addFile($val, basename($val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下  
            }  
        }  
        $zip->close();//关闭  
  
        if(!file_exists($zipName)){  
            exit("无法找到文件"); //即使创建,仍有可能失败  
        }  
  
        //如果不要下载,下面这段删掉即可,如需返回压缩包下载链接,只需 return $zipName;  
        header("Cache-Control: public");  
        header("Content-Description: File Transfer");  
        header('Content-disposition: attachment; filename='.basename($zipName)); //文件名  
        header("Content-Type: application/zip"); //zip格式的  
        header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件  
        header('Content-Length: '. filesize($zipName)); //告诉浏览器,文件大小  
        @readfile($zipName);  
    } 

本文标签:

版权声明:若无特殊注明,本文皆为《Leek》原创,转载请保留文章出处。

本文链接:thinkphp 批量打包下载文件 - https://pjax.cc/53.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

允许邮件通知