没有哪种教育能及得上逆境 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip

开发 memory发布于April 17, 2013 标签: PHP
<?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文件
}

相关推荐

添加新评论

全部评论:已有 12 条评论

Ivan

Ivan2016-12-09 22:16:54 回复

可以用,谢谢

指尖

指尖2016-11-01 10:47:44 回复

"Content-Type: application/zip" 是什么意思呀

wei

wei2016-06-12 11:42:54 回复

怎么远程批量下载PDF文件呢

memory

memory2016-06-13 08:42:04 回复

我想的是curl ...

初文

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

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

大师兄

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

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

memory

memory2015-08-13 13:46:24 回复

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

网站状态

  • 栏目分类:35个
  • 发布文章:1109篇
  • 用户评论:619条

最新回复

  • memory: 对,这个密钥最好是自己换一下。当然不嫌麻烦甚至可以考虑将密钥做到...
  • 小明明: 在加密的时候 秘钥固定不就可以机密了吗
  • 上海代理记账: 看起来代码有一些复杂的呀。。。
  • 香港云服务器: 站长不错,不错的干货
  • yet handsome: 我看了你的这个发现历史真的是惊人的相似,我们已经做到redis集...
  • memory: 好久不玩它们了,我的相关知识来自谷歌...
  • 于小鱼: 你好,想请教一些关于xen和kvm的问题。
  • memory: 如果将图片 base64_encode 后,再想取回以前的路径不...
  • 陈凌风: 我要区正常的路径显示怎么办?
  • genuiner: 牛逼
  • haitongz: 赞
  • memory: php64位? 这个我还真没有注意。。。回头再试试
  • Kngstr: 这个很简单,你用的PHP不是64位的,64位的dll只能在64位...
  • memory: 使用的是typecho.
  • GavinHsueh: 您好,我了解下您的博客是自己开发的么?看着很不错
  • 个人博客: 看看先
  • memory: 谢谢,已修正。
  • jrotty: 方法一中next后面少个'符号
  • daxia: mark
  • 企业孵化器: 厉害了