ThinkPHP实现将本地文件打包成zip下载


Posted in PHP onJune 26, 2014

首先,将FileToZip.class文件放到ThinkPHP/Extend/Library/ORG/Util/文件夹中,FileToZip.class.php为zip下载类,其详细代码如下:

<?php
/**
 * zip下载类文件
 * 遍历目录,打包成zip格式
 */
class traverseDir{
 public $currentdir;//当前目录
 public $filename;//文件名
 public $fileinfo;//用于保存当前目录下的所有文件名和目录名以及文件大小
 public $savepath;
 public function __construct($curpath,$savepath){
  $this->currentdir=$curpath;//返回当前目录
  $this->savepath=$savepath;//返回当前目录
 }  
 //遍历目录
 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($savepath.$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',$savepath); //下载文件
   $dw->getfiles();
   unlink($savepath.$zipname.'.zip'); //下载完成后要进行删除 
  }
 }
}
/**
 * 下载文件
 *
 */
class download{
 protected $_filename;
 protected $_filepath;
 protected $_filesize;//文件大小
 protected $savepath;//文件大小
 public function __construct($filename,$savepath){
  $this->_filename=$filename;
  $this->_filepath=$savepath.$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>";
  }
 }
}

ThinkPHP中加载zip下载类FileToZip.class.php并实现本地文件打包下载的功能代码如下所示:

import('ORG.Util.FileToZip');//引入zip下载类文件FileToZip
// 打包下载
$handler = opendir($cur_file); //$cur_file 文件所在目录
$download_file = array();
$i = 0;
while( ($filename = readdir($handler)) !== false ) {
 if($filename != '.' && $filename != '..') {
 $download_file[$i++] = $filename;
 }
}
closedir($handler);
$scandir=new traverseDir($cur_file,$save_path); //$save_path zip包文件目录
$scandir->tozip($download_file);
PHP 相关文章推荐
在WAMP环境下搭建ZendDebugger php调试工具的方法
Jul 18 PHP
如何使用php判断所处服务器操作系统的类型
Jun 20 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
destoon实现公司新闻详细页添加评论功能的方法
Jul 15 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
May 13 PHP
PHP实现一维数组与二维数组去重功能示例
May 24 PHP
php微信公众号开发之关键词回复
Oct 20 PHP
PHP PDOStatement::errorInfo讲解
Jan 31 PHP
PHP中的empty、isset、isnull的区别与使用实例
Mar 22 PHP
Centos7 Yum安装PHP7.2流程教程详解
Jul 02 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
Apr 26 PHP
ThinkPHP实现一键清除缓存方法
Jun 26 #PHP
destoon实现商铺管理主页设置增加新菜单的方法
Jun 26 #PHP
destoon在360浏览器下出现用户被强行注销的解决方法
Jun 26 #PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
Jun 26 #PHP
PHP执行Curl时报错提示CURL ERROR: Recv failure: Connection reset by peer的解决方法
Jun 26 #PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
Jun 26 #PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 #PHP
You might like
php绝对路径与相对路径之间关系的的分析
2010/03/03 PHP
简单的PHP留言本实例代码
2010/05/09 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
JavaScript DOM 学习第七章 表单的扩展
2010/02/19 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
浅析JS异步加载进度条
2016/05/05 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
iview中Select 选择器多选校验方法
2018/03/15 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
js实现提交前对列表数据的增删改查
2020/01/16 Javascript
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
python实现解数独程序代码
2017/04/12 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
python中join()方法介绍
2018/10/11 Python
破解安装Pycharm的方法
2018/10/19 Python
python 多线程串行和并行的实例
2019/02/22 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
通过cmd进入python的步骤
2020/06/16 Python
OpenCV图片漫画效果的实现示例
2020/08/18 Python
is_file和file_exists效率比较
2021/03/14 PHP
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
一道SQL面试题
2012/12/31 面试题
数控技术与应用毕业生自荐信
2013/09/24 职场文书
大学活动总结格式
2014/04/29 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
医学专业毕业生求职信
2014/06/20 职场文书
困难补助申请报告
2015/05/19 职场文书
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL