在使用php创建压缩包时使用下面的代码:
if ($zip->open($zipFilename, \ZipArchive::OVERWRITE) === TRUE) { if (file_exists($targetPath)) { Zip::addFileToZip($targetPath, $zip);//执行递归压缩目录的操作 } else { throw new NotFoundHttpException('该目录不存在或被删除'); } }
在本地开发环境各种测试没有问题,部署到测试环境,就报出这个错误:
ZipArchive::addFile(): Invalid or uninitialized Zip object
反复对比开发环境很测试环境配置,感觉不是配置问题,最后求助搜索引擎,看到有人提示:
\ZipArchive::CREATE | \ZipArchive::OVERWRITE
顿时感觉可能是没有创建文件导致,没有创建Zip object.
修改代码:
if ($zip->open($zipFilename, \ZipArchive::CREATE | \ZipArchive::OVERWRITE) === TRUE) { if (file_exists($targetPath)) { Zip::addFileToZip($targetPath, $zip);//执行递归压缩目录的操作 } else { throw new NotFoundHttpException('该目录不存在或被删除'); } }
问题就解决了。
附Zip处理类:
class Zip { public static function addFileToZip($path, &$zip,$root='') { $handler = opendir($path); //打开当前文件夹由$path指定。 !$root && $root = $path; while (($filename = readdir($handler)) !== false) { if ($filename != "." && $filename != "..") {//文件夹文件名字为'.'和‘..’,不要对他们进行操作 if (is_dir($path . "/" . $filename)) {// 如果读取的某个对象是文件夹,则递归 self::addFileToZip($path . "/" . $filename, $zip, $root); } else { //将文件加入zip对象 $pathFilename=$path . "/" . $filename; $zip->addFile($pathFilename, str_replace($root.'/','',$pathFilename)); } } } @closedir($path); } }