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令牌 Token改进版
Jul 18 PHP
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
Jul 03 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
php实现的获取网站备案信息查询代码(360)
Sep 23 PHP
PHP输出缓存ob系列函数详解
Mar 11 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
Feb 08 PHP
php计算整个mysql数据库大小的方法
Jun 19 PHP
Ubuntu 16.04下安装PHP 7过程详解
Mar 28 PHP
详解php伪造Referer请求反盗链资源
Jan 24 PHP
php基于协程实现异步的方法分析
Jul 17 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 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
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
jQuery中append、insertBefore、after与insertAfter的简单用法与注意事项
2020/04/04 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
基于JQuery的Select选择框的华丽变身
2011/08/23 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
javascript实现当前页导航激活的方法
2015/02/27 Javascript
简介JavaScript中的setHours()方法的使用
2015/06/11 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
vue-cli3 从搭建到优化的详细步骤
2019/01/20 Javascript
浅谈js闭包理解
2019/04/01 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
[46:53]Secret vs Liquid 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
django框架使用方法详解
2019/07/18 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
python实现从尾到头打印单链表操作示例
2020/02/22 Python
Windows下PyCharm配置Anaconda环境(超详细教程)
2020/07/31 Python
Python中猜拳游戏与猜筛子游戏的实现方法
2020/09/04 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
Delphi软件工程师试题
2013/01/29 面试题
英语专业推荐信
2013/11/16 职场文书
平面设计岗位职责
2013/12/14 职场文书
初三物理教学反思
2014/01/21 职场文书
美化环境标语
2014/06/20 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
利用Python将list列表写入文件并读取的方法汇总
2022/03/25 Python