PHP 使用ZipArchive压缩文件并下载

网站上需要提供一些打印数据给用户下载,这些文件每次都需要重新生成,因为随时都会有新的数据产生。网络上关于PHP的压缩功能实现有多种方式,比如PclZip,ZipArchive等。PclZip是使用PHP写的一个压缩解压类,方便使用,不用安装扩展;而ZipArchive则在PHP 5.3之后随PHP携带发行,不需要再去开启扩展。本文则使用PHP自带的ZipArchive进行文档压缩。
由于还要提供给用户下载,这里参考了网络上下载类,以下为downlaod.class.php代码

<?php
 class download{
	 protected $_filename;
	 protected $_filepath;
	 protected $_filesize;//文件大小
	 public function __construct($filename){
		 $this->_filename=$filename;
		 $this->_filepath=dirname(__FILE__).'/'.$filename;
	}
	public function __destruct() {
		if (file_exists($this->_filepath)){
			unlink($this->_filepath);
		}
	}
	//获取文件名
	public function getfilename(){
		return $this->_filename;
	}
	//获取文件路径(包含文件名)
	public function getfilepath(){
		return $this->_filepath;
	}
	//获取文件大小
	public function getfilesize(){
		return $this->_filesize=number_format(filesize($this->_filepath)/(1024*1024),2);//去小数点后两位
	}
	//下载文件的功能
	public function getfiles(){
		//检查文件是否存在
		if (file_exists($this->_filepath)){
			//打开文件
			$file = fopen($this->_filepath,"r");
			//返回的文件类型
			Header("Content-type: application/octet-stream");
			//按照字节大小返回
			Header("Accept-Ranges: bytes");
			//返回文件的大小
			Header("Accept-Length: ".filesize($this->_filepath));
			//这里对客户端的弹出对话框,对应的文件名
			Header("Content-Disposition: attachment; filename=".$this->_filename);
			//修改之前,一次性将数据传输给客户端
			echo fread($file, filesize($this->_filepath));
			//修改之后,一次只传输1024个字节的数据给客户端
			//向客户端回送数据
			$buffer=1024;//
			//判断文件是否读完
			while (!feof($file)) {
				//将文件读入内存
				$file_data=fread($file,$buffer);
				//每次向客户端回送1024个字节的数据
				echo $file_data;
			}
			fclose($file);
		}else {
			echo "<script>alert('对不起,您要下载的文件不存在');</script>";
		}
	}
}

ZipArchive有两个添加文件的方法addFile 和addFromString,addFile可将现有文件添加进去,而addFromStrin则可以添加一些动态的文本 。在要下载文件中则简单调用,代码如下

<?php
include 'download.class.php';
$res='';//动态结果

$zip=new ZipArchive();
$zipname=date('YmdHis',time()).'.zip';//随机文件名
if (!file_exists($zipname)){
    $zip->open($zipname,ZipArchive::OVERWRITE);//创建一个空的zip文件
    //$zip->addFile('/images/show.pic','show.pic');//将/images/show.pic文件添加进去
    //$content=file_get_contents('http://127.0.0.1/data.php?r='$res);
    //if ( $content !== false ) {
    //$zip->addFromString('data.xml',$content);//使用字符串的方式动态添加
    //}
    $zip->addFromString('test.txt', 'some text ...');
    $zip->close();
    $dw=new download($zipname); //下载文件
    $dw->getfiles();
    unlink($zipname); //下载完成后要主动删除    
}

注意在windows平台下压缩的文件路径在linux可能识别不了。
参考链接:
PclZip:强大的PHP压缩与解压缩zip类
PHP ZipArchive 实现压缩解压Zip文件
文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
php ZipArchive class

发表评论

电子邮件地址不会被公开。 必填项已用*标注