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 相关文章推荐
用libTemplate实现静态网页的生成
Oct 09 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
深入PHP autoload机制的详解
Jun 09 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
php实现比较全的数据库操作类
Jun 18 PHP
PHP生成唯一订单号
Jul 05 PHP
PHP 数组遍历foreach语法结构及实例
Jun 13 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
解决在laravel中leftjoin带条件查询没有返回右表为NULL的问题
Oct 15 PHP
PHP var关键字相关原理及使用实例解析
Jul 11 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递归删除目录下的文件但保留的实例分享
2014/05/10 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
php中Ctype函数用法详解
2014/12/09 PHP
静态html文件执行php语句的方法(推荐)
2016/11/21 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
Javascript客户端脚本的设计和应用
2006/08/21 Javascript
JavaScript 异步调用框架 (Part 3 - 代码实现)
2009/08/04 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
Javascript 面向对象编程(coolshell)
2012/03/18 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
jquery写个checkbox——类似邮箱全选功能
2013/03/19 Javascript
纯js和css实现渐变色包括静态渐变和动态渐变
2014/05/29 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
2014/12/22 Javascript
JQuery实现级联下拉框效果实例讲解
2015/09/17 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
详解jQuery停止动画——stop()方法的使用
2016/12/14 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
vue中提示$index is not defined错误的解决方式
2020/09/02 Javascript
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
利用Tensorflow的队列多线程读取数据方式
2020/02/05 Python
python中什么是面向对象
2020/06/11 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
关于canvas.toDataURL 在iOS运行失败的问题解决
2020/09/16 HTML / CSS
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
实习生个人的自我评价
2013/12/08 职场文书
预备党员思想汇报范文
2014/01/11 职场文书
残疾人创业典型事迹
2014/02/01 职场文书
手工社团活动方案
2014/02/17 职场文书
公证书样本
2014/04/10 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS