解决php ZipArchive::addFile(): Invalid or uninitialized Zip object错误


在使用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);
    }
}

 

Archives