几行代码轻松实现PHP文件打包下载zip


Posted in PHP onMarch 01, 2017

本文实例为大家分享了PHP文件打包下载zip的具体代码,供大家参考,具体内容如下

<?php
//获取文件列表
function list_dir($dir){
   $result = array();
   if (is_dir($dir)){
   $file_dir = scandir($dir);
   foreach($file_dir as $file){
    if ($file == '.' || $file == '..'){
    continue;
    }
    elseif (is_dir($dir.$file)){
    $result = array_merge($result, list_dir($dir.$file.'/'));
    }
    else{
    array_push($result, $dir.$file);
    }
   }
   }
   return $result;
  }

//获取列表 
$datalist=list_dir('../');
$filename = "./bak.zip"; //最终生成的文件名(含路径)  
if(!file_exists($filename)){  
//重新生成文件  
  $zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释  
  if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {  
    exit('无法打开文件,或者文件创建失败');
  }  
  foreach( $datalist as $val){  
    if(file_exists($val)){  
      $zip->addFile( $val, basename($val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下  
    }  
  }  
  $zip->close();//关闭  
}  
if(!file_exists($filename)){  
  exit("无法找到文件"); //即使创建,仍有可能失败。。。。  
}  
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);
?>

PHP ZipArchive是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP扩展已经开启,具体开启方法这里就不说了,不同的平台开启PHP扩增的方法网上都有,如有疑问欢迎交流。

这里整理一下利用php zipArchive进行文件的压缩与解压缩的常用的示例供参考。

一、解压缩zip文件

$zip=new ZipArchive;//新建一个ZipArchive的对象
 if($zip->open('test.zip')===TRUE){
 $zip->extractTo('images');//假设解压缩到在当前路径下images文件夹内
 $zip->close();//关闭处理的zip文件
}

二、将文件压缩成zip文件

$zip=new ZipArchive;
if($zip->open('test.zip',ZipArchive::OVERWRITE)===TRUE){
 $zip->addFile('image.txt');//假设加入的文件名是image.txt,在当前路径下
 $zip->close();
}

三、文件追加内容添加到zip文件

$zip=new ZipArchive;
$res=$zip->open('test.zip',ZipArchive::CREATE);
if($res===TRUE){
 $zip->addFromString('test.txt','file content goes here');
 $zip->close();
 echo 'ok';
}else{
 echo 'failed';
}

四、将文件夹打包成zip文件

function addFileToZip($path,$zip){
 $handler=opendir($path); //打开当前文件夹由$path指定。
 while(($filename=readdir($handler))!==false){
 if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..',不要对他们进行操作
  if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
  addFileToZip($path."/".$filename, $zip);
  }else{ //将文件加入zip对象
  $zip->addFile($path."/".$filename);
  }
 }
 }
 @closedir($path);
}
$zip=new ZipArchive();
if($zip->open('images.zip', ZipArchive::OVERWRITE)=== TRUE){
 addFileToZip('images/', $zip); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
 $zip->close(); //关闭处理的zip文件
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
discuz 首页四格:最新话题+最新回复+热门话题+精华文章插件
Aug 19 PHP
php面向对象全攻略 (二) 实例化对象 使用对象成员
Sep 30 PHP
深入理解require与require_once与include以及include_once的区别
Jun 05 PHP
php调用Google translate_tts api实现代码
Aug 07 PHP
php事务处理实例详解
Jul 11 PHP
PHP生成json和xml类型接口数据格式
May 17 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
PHP编写RESTful接口
Feb 23 PHP
php简单创建zip压缩文件的方法
Apr 30 PHP
php简单压缩css样式示例
Sep 22 PHP
Yii2框架中一些折磨人的坑
Dec 15 PHP
PHP 命名空间和自动加载原理与用法实例分析
Apr 29 PHP
PHP去除字符串最后一个字符的三种方法实例
Mar 01 #PHP
深入讲解PHP的对象注入(Object Injection)
Mar 01 #PHP
PHP实现图片批量打包下载功能
Mar 01 #PHP
深入解析PHP中SESSION反序列化机制
Mar 01 #PHP
yii2使用GridView实现数据全选及批量删除按钮示例
Mar 01 #PHP
PHP插件PHPMailer发送邮件功能
Feb 28 #PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
Feb 28 #PHP
You might like
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
利用javascript中的call实现继承
2007/01/22 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
js判断是否为ie的方法小结
2014/01/13 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
javascript自定义滚动条实现代码
2020/04/20 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
利用Jasmine对Angular进行单元测试的方法详解
2017/06/12 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
微信小程序 页面跳转事件绑定的实例详解
2017/09/20 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
Layui给switch添加响应事件的例子
2019/09/03 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
Python httplib,smtplib使用方法
2008/09/06 Python
python实现中文转换url编码的方法
2016/06/14 Python
Python request设置HTTPS代理代码解析
2018/02/12 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
2018/03/14 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
使用python无账号无限制获取企查查信息的实例代码
2020/04/17 Python
Python logging自定义字段输出及打印颜色
2020/11/30 Python
会计电算一体化个人简历的自我评价
2013/10/15 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
2015年小学数学教师工作总结
2015/05/20 职场文书
redis通过6379端口无法连接服务器(redis-server.exe闪退)
2021/05/08 Redis
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle
一文搞懂PHP中的抽象类和接口
2022/05/25 PHP