public function addFileToZip($path, ZipArchive $zip, $sub_dir = ''){ $handler = opendir($path); while (($filename = readdir($handler)) !== false) { if ($filename != "." && $filename != "..") { //文件夹文件名字为'.'和‘..’,不要对他们进行操作 if (is_dir($path . $filename)) { $localPath = $sub_dir.$filename.'/'; //关键在这里,需要加上上一个递归的子目录,核心代码 // 如果读取的某个对象是文件夹,则递归 $this->addFileToZip($path . $filename . '/', $zip, $localPath); } else { //将文件加入zip对象 $zip->addFile($path . $filename, $sub_dir . $filename ); //$sub_dir . $filename 这个参数是你打包成压缩文件的目录结构,可以调整这里的规则换成你想要存的目录 } } } @closedir($handler); } //调用的时候, $zip = new ZipArchive(); //压缩文件 $needZipFile = '../../example'; $targetZipFile = 'targetZip.zip'; if ($zip->open($targetZipFile, ZipArchive::CREATE) === TRUE) { $this->addFileToZip($needZipFile, $zip,'example/'); // ‘example/’这个参数要传,是你打包生成后的根目录名称,你可以随意换成你想要的目录名称 $zip->close(); //关闭处理的zip文件 } //提供下载功能 $downname = "example.zip"; $fp = fopen($targetZipFile, "r"); $file_size = filesize($targetZipFile);//获取文件的字节 //下载文件需要用到的头 Header("Content-type: application/octet-stream"); Header("Accept-Ranges: bytes"); Header("Accept-Length:" . $file_size); Header("Content-Disposition: attachment; filename=$downname"); $buffer = 1024; //设置一次读取的字节数,每读取一次,就输出数据(即返回给浏览器) $file_count = 0; //读取的总字节数 //向浏览器返回数据 如果下载完成就停止输出,如果未下载完成就一直在输出。根据文件的字节大小判断是否下载完成 while (!feof($fp) && $file_count < $file_size) { $file_con = fread($fp, $buffer); $file_count += $buffer; echo $file_con; } fclose($fp); //下载完成后删除压缩包,临时文件夹 if ($file_count >= $file_size) { unlink($targetZipFile); }
发表评论 取消回复