<?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 != "." &amp;&amp; $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

已有 8 条评论

    1. 求博主写一段下载压缩包并且解压的代码,小弟感谢不尽!
      如果可以的话,那就发送到我的邮箱吧

      初文
      2015-11-06 18:15:11

      回复

    2. 贴出来的代码被转义了,这是个巨坑啊。如果能做到像博客园那样(贴代码)就好了

      大师兄
      2015-08-13 09:45:00

      回复

      1. 额~我测试的好像是OK的,环境不同可能效果不一样了。。

        memory
        2015-08-13 13:46:24

        回复

    3. is_dir($dir.$file) 这一句有bug,之间要添加 DIRECTORY_SEPARATOR

      accumulate2014
      2015-04-20 11:24:58

      回复

    4. $zip=new ZipArchive; 这个东西需要怎么弄呢?能解答一下吗?

      xiaok
      2014-12-04 16:31:21

      回复

      1. @xiaok:php有个扩展,打开了,这货就能使了

        Memory
        2014-12-04 17:29:30

        回复

    5. 有bug

      BBcoder
      2014-06-13 10:50:29

      回复

      1. @BBcoder:具体撒BUG,我在我本地环境测试OK的

        Memory
        2014-06-13 20:42:14

        回复

使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip的更多相关文章

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

    <?php //获取文件列表 function list_dir($dir){ $result = array(); if (is_dir($dir)){ $file_dir = scandir ...

  2. 使用line_profiler查看api接口函数每行代码执行时间

    项目情景描述: 在restful架构风格的项目交付测试的过程中,某接口出现 请求超时导致的http 502 Bad Gateway,于是开始排查具体是接口函数中的哪行代码或函数 响应时间过长导致的50 ...

  3. 在C++里一个类成员函数多少行代码才是最好呢?

    这个问题,很多同事以及学生都问我这个问题.其实这是一个比较实际的问题,因为设计一个类成员函数的好与坏,决定了一个类代码的质量. 为了回答这个问题,昨晚又重新看看斯坦福大学的编程视频,可以用下面这个截图 ...

  4. Python+moviepy使用manual_tracking和headblur函数10行代码实现视频人脸追踪打马赛克

    ☞ ░ 前往老猿Python博文目录 ░ 一.背景知识 1.1.headblur简介 追踪人脸打马赛克需要使用headblur函数. 调用语法: headblur(clip,fx,fy,r_zone, ...

  5. 【分享】我们用了不到200行代码实现的文件日志系统,极佳的IO性能和高并发支持,附压力测试数据

    很多项目都配置了日志记录的功能,但是,却只有很少的项目组会经常去看日志.原因就是日志文件生成规则设置不合理,将严重的错误日志跟普通的错误日志混在一起,分析起来很麻烦. 其实,我们想要的一个日志系统核心 ...

  6. 文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件

    总结:                                                          使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文: ...

  7. 安卓开发学习历程1——《第一行代码》coolweather项目setOnItemClickListener函数,Sql语句修改对模拟app程序机影响

    今天,将<第一行代码>最后实战的coolweather项目,认真做了一遍. 今晚,在书中第一阶段开发代码认眞在Android studio敲完,发现setOnItemClickListen ...

  8. ReportingService 通过RowNumber函数获取行号和生成隔行变色样式

    以前一直没有搞明白SSRS里面的RowNumber函数到底该怎么用,所以一直没有很好的办法在SSRS中的表格上实现隔行变色的样式,实现隔行变色的关键就是获取表格中每一行的行号.在最近了解了下这个函数, ...

  9. jquery完成带单选按钮的表格行高亮显示

    jquery完成带单选按钮的表格行高亮显示 上篇博客写的是复选框的,这次写的是单选框的,有时查询的时候,只能选择一条记录,如果将选中的这条记录的行高亮显示,同时该行的单选按钮也被选中了,这样会提高用户 ...

随机推荐

  1. 线程池ThreadPoolExecutor里面4种拒绝策略

    ThreadPoolExecutor类实现了ExecutorService接口和Executor接口,可以设置线程池corePoolSize,最大线程池大小,AliveTime,拒绝策略等.常用构造方 ...

  2. 使用 Rcpp

    正如我们所提到的那样,并行计算只有在每次迭代都是独立的情况下才可行,这样最终结果才不会依赖运行顺序.然而,并非所有任务都像这样理想.因此,并行计算可能会受到影响.那么怎样才能使算法快速运行,并且可以轻 ...

  3. [转] VR-FORCES 介绍

    转自:https://sanwen8.cn/p/1e6GQeK.html 今天给各位介绍的仿真平台是VR-Forces.VR-Forces是新加坡公司MAK的产品,前身是美国公司.在仿真平台领域里面, ...

  4. python实现本地批量ping多个IP

    本文主要利用python的相关模块进行批量ping ,测试IP连通性. 下面看具体代码(python3): #!/usr/bin/env python#-*-coding:utf-8-*- impor ...

  5. III USP Freshmen ContestH. MaratonIME gets candies

    这题挺有意思的,刚开始不会这交互题,模仿着做了一题就会了,蛮简单 的 这题我用2分,结果wa了,想了一下发现,1到1e9二分50次完全不够用啊,那就转换一下思维,先求出在10^n~10^(n+1)的n ...

  6. thread.event说明

    Python中的threading.Event()操控多线程的过程有: - 定义事件:man_talk_event = threading.Event() - 创建线程,传入对应事件:t1 = thr ...

  7. git 如何关联多个库

    git 如何关联多个库 在本地同一个库进行操作多个库,可以把代码推送到不同的库中,可以拉取某个库指定的代码,这样更加灵活使用 git remote 查看远程主机名 git remote -v // λ ...

  8. STL标准库-容器-deque

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性. deque双向开口可进可出的容器 我们知道连续内存的容器不能随意扩充,因为这样容易扩充别人那去 deque却可以,它创造了内存 ...

  9. 创建目录mkdir

    mkdir -p 在创建目录时,我们通常会先检查一下是否存在,如果不存在,就创建,这个时候通常用mkdir -p进行,但是-p是干什么用的呢. mkdir --help一下吧.也就说,如果上级目录不存 ...

  10. It is the courage

    It is the reality that a society which becomes lower and becomes weak.Believe it or not,I think it i ...