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 相关文章推荐
COM in PHP (winows only)
Oct 09 PHP
php学习之变量的使用
May 29 PHP
php设计模式 Interpreter(解释器模式)
Jun 26 PHP
php 判断访客是否为搜索引擎蜘蛛的函数代码
Jul 29 PHP
PHP支持多种格式图片上传(支持jpg、png、gif)
Nov 03 PHP
有关PHP性能优化的介绍
Jun 20 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
Jan 14 PHP
PHP多线程之内部多线程实例分析
Mar 09 PHP
PHP中STDCLASS用法实例分析
Nov 11 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
Yii2.0建立公共方法简单示例
Jan 29 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
Feb 15 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
第三节 定义一个类 [3]
2006/10/09 PHP
PHP初学入门
2006/11/19 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
PHP加Nginx实现动态裁剪图片方案
2014/03/10 PHP
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
Angular简单验证功能示例
2017/12/22 Javascript
javascript回调函数详解
2018/02/06 Javascript
vue 表单之通过v-model绑定单选按钮radio
2019/05/13 Javascript
vue-cli 项目打包完成后运行文件路径报错问题
2019/07/19 Javascript
Nuxt配置Element-UI按需引入的操作方法
2020/07/06 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
[06:50]DSPL次级职业联赛十强晋级之路
2014/11/18 DOTA
把MySQL表结构映射为Python中的对象的教程
2015/04/07 Python
Python中subprocess的简单使用示例
2015/07/28 Python
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
Expected conditions模块使用方法汇总代码解析
2020/08/13 Python
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
单位单身证明范本
2014/01/11 职场文书
拉拉队口号
2014/06/16 职场文书
煤矿安全协议书
2014/08/20 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
新闻稿怎么写
2015/07/18 职场文书
Redis基本数据类型String常用操作命令
2022/06/01 Redis