原文来自于:http://courages.us/archives/176
网站上需要提供一些打印数据给用户下载,这些文件每次都需要重新生成,因为随时都会有新的数据产生。网络上关于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
);
//下载完成后要主动删除
}