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


Posted in PHP onJune 13, 2012

总结:

 

使用PHP下载文件的操作需要给出四个header(),可以参考我的另一篇博文:PHP如何实现下载功能超详细流程分析
计算文件的大小的时候,并不需要先打开文件,通过filesize($filename)就可以看出,如果需要先打开文件的话,filesize可能就会是这样的形式了filesize($filehandle)
向客户端回送数据的是,记得要设置一个buffer,用来指定每次向客户端输出多少数据,如:$buffer=1023。如果不指定的话,就会将整个文件全部写入内存当中,再一次性的讲数据传送给客户端
通过feof()函数,可以判断要读取的文件是否读完,如果还没读完,继续读取文件($file_data=fread()),并将数据回送给客户端(echo $file_data)
每次下载完成后,在客户端都会刷新下,说明了,其实每次都将数据写入到一个临时文件中,等全部下载完成后,再将所有的数据重新整合在一起
这里我使用的是绝对路径,绝对路径有个好处,就是适应性比较强,而且相对于相对路径,效率更高(免去了查找文件的过程)
分析下技术要点:

将文件打包成zip格式

下载文件的功能

要点解析:

这里我采用的是php自带的ZipArchive类

a) 我们只需要new一个ZipArchive对象,然后使用open方法创建一个zip文件,接着使用addFile方法,将要打包的文件写入刚刚创建的zip文件中,最好还得记得关闭该对象。

b) 注意点:使用open方法的时候,第二个参数$flags是可选的,$flags用来指定对打开的zip文件的处理方式,共有四种情况

  i. ZIPARCHIVE::OVERWRITE 总是创建一个新的文件,如果指定的zip文件存在,则会覆盖掉

ii. ZIPARCHIVE::CREATE 如果指定的zip文件不存在,则新建一个

iii. ZIPARCHIVE::EXCL 如果指定的zip文件存在,则会报错

iv. ZIPARCHIVE::CHECKCONS

下载文件的流程:

 

服务器端的工作:

客户端的浏览器发送一个请求到处理下载的php文件。
注意:任何一个操作都首先需要写入到内存当中,不管是视频、音频还是文本文件,都需要先写入到内存当中。
换句话说,将“服务器”上的文件读入到“服务器”的内存当中的这个操作时必不可少的(注意:这里我将服务器三个字加上双引号,主要是说明这一系类的操作时在服务器上完成的)。<br>
既然要将文件写入到内存当中,就必然要先将文件打开
所以这里就需要三个文件操作的函数了:
一:fopen($filename ,$mode)
二:fread ( int $handle , int $length )
三:fclose ( resource $handle )

客户端端的工作:

那么,如何将已经存在于服务器端内存当中的文件信息流,传给客户端呢?
答案是通过header()函数,客户端就知道该如何处理文件,是保存还是打开等等

最终的效果如下图所示:

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

<?php 
require'./download.php'; 
/** 
* 遍历目录,打包成zip格式 
*/ 
class traverseDir{ 
public $currentdir;//当前目录 
public $filename;//文件名 
public $fileinfo;//用于保存当前目录下的所有文件名和目录名以及文件大小 
public function __construct(){ 
$this->currentdir=getcwd();//返回当前目录 
} 
//遍历目录 
public function scandir($filepath){ 
if (is_dir($filepath)){ 
$arr=scandir($filepath); 
foreach ($arr as $k=>$v){ 
$this->fileinfo[$v][]=$this->getfilesize($v); 
} 
}else { 
echo "<script>alert('当前目录不是有效目录');</script>"; 
} 
} 
/** 
* 返回文件的大小 
* 
* @param string $filename 文件名 
* @return 文件大小(KB) 
*/ 
public function getfilesize($fname){ 
return filesize($fname)/1024; 
} 
/** 
* 压缩文件(zip格式) 
*/ 
public function tozip($items){ 
$zip=new ZipArchive(); 
$zipname=date('YmdHis',time()); 
if (!file_exists($zipname)){ 
$zip->open($zipname.'.zip',ZipArchive::OVERWRITE);//创建一个空的zip文件 
for ($i=0;$i<count($items);$i++){ 
$zip->addFile($this->currentdir.'/'.$items[$i],$items[$i]); 
} 
$zip->close(); 
$dw=new download($zipname.'.zip'); //下载文件 
$dw->getfiles(); 
unlink($zipname.'.zip'); //下载完成后要进行删除 
} 
} 
} 
?>

<?php 
/** 
* 下载文件 
* 
*/ 
class download{ 
protected $_filename; 
protected $_filepath; 
protected $_filesize;//文件大小 
public function __construct($filename){ 
$this->_filename=$filename; 
$this->_filepath=dirname(__FILE__).'/'.$filename; 
} 
//获取文件名 
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>"; 
} 
} 
} 
?>

页面显示的代码:
<script type="text/javascript" src="jquery-1.7.2.js"></script> 
<script type="text/javascript" src="ajax.js"></script> 
<?php 
header("Content-type:text/html;charset=utf8"); 
require('./getfile.php'); 
$scandir=new traverseDir(); 
$scandir->scandir($scandir->currentdir); 
$scandir->currentdir; if (isset($_POST['down_load'])){ 
$items=$_POST['items']; 
$scandir->tozip($items);//将文件压缩成zip格式 
} 
echo "当前的工作目录:".$scandir->currentdir; 
echo "<br>当前目录下的所有文件"; 
?> 
<form action="list.php" method="POST"> 
<table> 
<tr> 
<td></td> 
<td>名称</td> 
<td>大小(KB)</td> 
</tr> 
<?php 
$res=$scandir->fileinfo; 
foreach ($res as $k=>$v){ 
if (!($k=='.' || $k=='..')) {//过滤掉.和.. 
?> 
<tr> 
<td><input type="checkbox" name="items[]" class="filename" value="<?php echo $k;?>"></td> 
<td><?php echo $k; ?></td> 
<td><?php echo number_format($v[0],0); ?></td> 
</tr> 
<?php 
} 
} 
?> 
<tr> 
<td><input type="checkbox" id="selall"><label for="selall">全选</label></td> 
<td><input type="submit" name="down_load" value="打包并下载" id="tozip_tetttt"></td> 
</tr> 
</table> 
</form>
PHP 相关文章推荐
PHP4和PHP5性能测试和对比 测试代码与环境
Aug 17 PHP
php_xmlhttp 乱码问题解决方法
Aug 07 PHP
PHP 危险函数全解析
Sep 09 PHP
PHP中防止直接访问或查看或下载config.php文件的方法
Jul 07 PHP
php静态文件返回304技巧分享
Jan 06 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
Apr 14 PHP
PHP快速生成各种信息提示框的方法
Feb 03 PHP
Android AsyncTack 异步任务实例详解
Nov 02 PHP
PHP基于DOMDocument解析和生成xml的方法分析
Jul 17 PHP
ThinkPHP5.0 图片上传生成缩略图实例代码说明
Jun 20 PHP
laravel框架上传图片实现实时预览功能
Oct 14 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
Feb 11 PHP
Php中文件下载功能实现超详细流程分析
Jun 13 #PHP
php异常处理技术,顶级异常处理器
Jun 13 #PHP
PHP的异常处理类Exception的使用及说明
Jun 13 #PHP
PHP抽象类 介绍
Jun 13 #PHP
MySQL 日期时间函数常用总结
Jun 12 #PHP
PHP简洁函数(PHP简单明了函数语法)
Jun 10 #PHP
php数字游戏 计算24算法
Jun 10 #PHP
You might like
PHP中路径问题的解决方案
2006/10/09 PHP
PHP伪静态Rewrite设置之APACHE篇
2014/07/30 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
PHP实现的网站目录扫描索引工具
2016/09/08 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
阻止事件(取消浏览器对事件的默认行为并阻止其传播)
2013/11/03 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
jQuery中nextAll()方法用法实例
2015/01/07 Javascript
BOOTSTRAP时间控件显示在模态框下面的bug修复
2015/02/05 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
Node.js包管理器Yarn的入门介绍与安装
2016/10/17 Javascript
原生js实现商品放大镜效果
2017/01/12 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
JS简单实现获取元素的封装操作示例
2017/04/07 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
vue+element 实现商城主题开发的示例代码
2020/03/26 Javascript
python虚拟环境迁移方法
2019/01/03 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
Puma印度官网:德国运动品牌
2019/10/06 全球购物
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
英语师范专业毕业生自荐信
2013/09/21 职场文书
单位介绍信范文
2014/01/18 职场文书
中秋晚会活动方案
2014/08/31 职场文书
2015年119消防宣传日活动总结
2015/03/24 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
廉洁自律承诺书2016
2016/03/25 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL
MySQL索引失效十种场景与优化方案
2023/05/08 MySQL