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 相关文章推荐
PHP.MVC的模板标签系统(五)
Sep 05 PHP
PHP4实际应用经验篇(7)
Oct 09 PHP
ASP和PHP都是可以删除自身的
Apr 09 PHP
PHP 无限分类三种方式 非函数的递归调用!
Aug 26 PHP
自己写的php中文截取函数mb_strlen和mb_substr
Feb 09 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
ThinkPHP进程计数类Process用法实例详解
Sep 25 PHP
apache和PHP如何整合在一起
Oct 12 PHP
Smarty变量用法详解
May 11 PHP
cakephp常见知识点汇总
Feb 24 PHP
Laravel实现表单提交
May 07 PHP
Laravel中10个有用的用法小结
May 06 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
Mysql的常用命令
2006/10/09 PHP
PHP开启gzip页面压缩实例代码
2010/03/11 PHP
PHP 作用域解析运算符(::)
2010/07/27 PHP
深入理解PHP内核(二)之SAPI探究
2015/11/10 PHP
JQuery 构建客户/服务分离的链接模型中Table中的排序分析
2010/01/22 Javascript
JavaScript聚焦于第一个字段的代码
2010/10/15 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
以JSON形式将JS中Array对象数组传至后台的方法
2014/01/06 Javascript
实例解析Array和String方法
2016/12/14 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
jquery获取select选中值的文本,并赋值给另一个输入框的方法
2018/08/21 jQuery
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
VUE.CLI4.0配置多页面入口的实现
2019/11/25 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
python flask安装和命令详解
2019/04/02 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
加拿大时装零售商:Influence U
2018/12/22 全球购物
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
大学生党课思想汇报
2013/12/29 职场文书
小学二年级学生评语
2014/04/21 职场文书
交警个人先进事迹材料
2014/05/11 职场文书
护理专业自荐书
2014/06/04 职场文书
我们的节日中秋活动方案
2014/08/19 职场文书
小学教师教学反思
2016/02/24 职场文书
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL