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