文章代码环境:
PHP5.6
ThinkPHP V5.0.13
nginx/1.6.2
先贴代码
-
//压缩文件 -
function zip(){ -
$files = array('upload/qrcode/1/100001.jpg','upload/qrcode/1/100002.jpg'); -
//$files = array('upload/qrcode/1/1.jpg'); -
$zipName = 'upload/qrcode/1/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); -
}
代码可以直接放在控制器里,也可以直接放在模型里,当然也可以直接放到common.php公共函数里。
总之,ZipArchive属于php的扩展类,不用单独添加类库。
这里不得不说一个大坑。
我的应用场景是需要每次都是创建一个新的压缩包,如果之前存在,则直接覆盖,不要追加
so,根据官方文档和参考其他代码,$zip->open的第二个参数我应该用 ZipArchive::OVERWRITE
问题来了,当这个压缩包不存在的时候,会报错:ZipArchive::addFile(): Invalid or uninitialized Zip object
也就是说,通过我的测试发现,ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效
所以我的解决方案是 $zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)
报错提示:

另外,如果用的不是thinkPHP框架,只需要把
new \ZipArchive
if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) {
两行中的 Zip前的反斜杠去掉即可
new ZipArchive
if ($zip->open($zipName, ZIPARCHIVE::OVERWRITE | ZIPARCHIVE::CREATE)!==TRUE) {
其他不变。
本文内容参考了:
http://blog.youkuaiyun.com/dreamboycx/article/details/49304951
本文介绍了一种使用PHP的ZipArchive类来创建并压缩文件的方法,特别关注如何在文件不存在时创建新的压缩包,并在存在时进行覆盖,避免追加内容。
235

被折叠的 条评论
为什么被折叠?



