几行代码轻松实现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 相关文章推荐
DOMXML函数笔记
Oct 09 PHP
PHP编实现程动态图像的创建代码
Sep 28 PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 PHP
php查看网页源代码的方法
Mar 13 PHP
php防止sql注入简单分析
Mar 18 PHP
Apache连接PHP后无法启动问题解决思路
Jun 18 PHP
CodeIgniter与PHP5.6的兼容问题
Jul 16 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
php实现等比例不失真缩放上传图片的方法
Nov 14 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
Apr 09 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 01 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
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
2019/06/12 PHP
PHP利用DWZ.CN服务生成短网址
2019/08/11 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
(function($){...})(jQuery)的意思
2010/07/22 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
2016/01/23 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
JS实现汉字与Unicode码相互转换的方法详解
2017/04/28 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
jquery的 filter()方法使用教程
2018/03/22 jQuery
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
Python实现的递归神经网络简单示例
2017/08/11 Python
python递归实现快速排序
2018/08/18 Python
解决python中无法自动补全代码的问题
2018/12/04 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
python中metaclass原理与用法详解
2019/06/25 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
公司年会抽奖活动主持词
2014/03/31 职场文书
农民工讨薪标语
2014/06/26 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
组织委员竞选稿
2015/11/21 职场文书
2019年共青团工作条例最新版
2019/11/12 职场文书
Nginx配置80端口访问8080及项目名地址方法解析
2021/03/31 Servers
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android
服务器nginx权限被拒绝解决案例
2022/09/23 Servers
keepalived + nginx 实现高可用方案
2022/12/24 Servers