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语法(5)
Oct 09 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
Apr 23 PHP
浅谈php安全性需要注意的几点事项
Jul 17 PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
Apr 08 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
Aug 17 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
Sep 22 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
Nov 13 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
Dec 26 PHP
PHP XML Expat解析器知识点总结
Feb 15 PHP
thinkPHP和onethink微信支付插件分享
Aug 11 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
May 14 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面试常用算法(推荐)
2016/07/22 PHP
jQuery 各种浏览器下获得日期区别
2008/12/22 Javascript
javascript 进度条 实现代码
2009/07/30 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
判断在css加载完毕后执行后续代码示例
2014/09/03 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
JavaScript知识点总结之如何提高性能
2016/01/15 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
javaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序整理总结
2016/10/10 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
Python批量查询域名是否被注册过
2017/06/21 Python
酷! 程序员用Python带你玩转冲顶大会
2018/01/17 Python
快速了解python leveldb
2018/01/18 Python
pygame游戏之旅 计算游戏中躲过的障碍数量
2018/11/20 Python
python中bs4.BeautifulSoup的基本用法
2019/07/27 Python
python几种常用功能实现代码实例
2019/12/25 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
Django实现celery定时任务过程解析
2020/04/21 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
Django Auth用户认证组件实现代码
2020/10/13 Python
Html5 滚动穿透的方法
2019/05/13 HTML / CSS
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
一套带网友答案的.NET笔试题
2016/12/06 面试题
迟到检讨书900字
2014/01/14 职场文书
节能标语大全
2014/06/21 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
分居协议书范本
2014/11/03 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
《女娲补天》读后感5篇
2019/12/31 职场文书
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript