PHP应用
PHP压缩包下载
### 1. 打包下载,首先你要确保你打包这些文件都在同一个文件夹里面。直接上代码 页面代码:就一个a标签 ```html <a target="_blank" href="tasks/download_files" > 批量下载任务文件</a> ``` 控制器: ```php public function download_files(){ //要打包的文件 $files = ['uploads/task/task1.xls','uploads/task/task2.xls','uploads/task/task2.xls']; $zip = new \ZipArchive; //压缩文件名 $filename = 'uploads/task/download.zip'; //新建zip压缩包 $zip->open($filename,\ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE); //把文件一个一个加进去压缩 foreach ($files as $key => $value) { $zip->addFile($value,basename($value)); } // 打包zip $zip->close(); header("Cache-Control: public"); header("Content-Description: File Transfer"); header('Content-disposition: attachment; filename='.basename($filename)); //文件名 header("Content-Type: application/zip"); //zip格式的 header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件 header('Content-Length: '. filesize($filename)); //告诉浏览器,文件大小 @readfile($filename); } ``` 这里要注意一下 文件地址,都是 相对路径,不能写绝对路径,也就是 uploads 前 不能加 / ### 2. ```php //压缩文件 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框架,只需要把 ```php new \ZipArchive if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE)!==TRUE) { ``` 两行中的 Zip前的反斜杠去掉即可 ```php new ZipArchive if ($zip->open($zipName, ZIPARCHIVE::OVERWRITE | ZIPARCHIVE::CREATE)!==TRUE) { ```
顶部
收展
底部
[TOC]
目录
PHP中常用的header头部定义
PHP压缩包下载
PHP文件下载
PHP常用加密函数总结
URL请求参数加解密
PHP文件操作功能函数
PHP判断远程文件是否存在
PHP生成GUID的函数
PHP通用请求函数CURL封装
PHP获取访问者IP地址
PHP图片操作
PHP实现发红包程序
PHP各种验证代码
PHP防XSS 防SQL注入的代码
PHP遍历目录下的全部文件
PHP获取中文字符拼音首字母
PHP判断输入数据是否合法常用的类
相关推荐
PHP底层
PHP面向对象
PHP工具类
PHP编程经验
PHP框架