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 相关文章推荐
模仿OSO的论坛(一)
Oct 09 PHP
一个好用的分页函数
Nov 16 PHP
php 删除记录同时删除图片文件的实现代码
May 12 PHP
php简单提示框alert封装函数
Aug 08 PHP
php添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
PHP 使用pcntl和libevent 实现Timer功能
Oct 27 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
Nov 19 PHP
php构造函数的继承方法
Feb 09 PHP
PHP也能干大事之PHP中的编码解码详解
Apr 20 PHP
php面向对象与面向过程两种方法给图片添加文字水印
Aug 26 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
ThinkPHP5+Layui实现图片上传加预览功能
Aug 17 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
星际争霸 Starcraft 游戏介绍
2020/03/14 星际争霸
支持php4、php5的mysql数据库操作类
2008/01/10 PHP
php实现复制移动文件的方法
2015/07/29 PHP
理解javascript中的原型和原型链
2015/07/30 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
详解angularJs模块ui-router之状态嵌套和视图嵌套
2017/04/28 Javascript
微信小程序日期时间选择器使用方法
2018/02/01 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
javascript中undefined的本质解析
2019/07/31 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
js实现的订阅发布者模式简单示例
2020/03/14 Javascript
原生JavaScript实现五子棋游戏
2020/11/09 Javascript
[54:08]LGD女子刀塔学院 DOTA2炼金术士教学
2014/01/09 DOTA
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
Python collections模块实例讲解
2014/04/07 Python
Python实现的石头剪子布代码分享
2014/08/22 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
Python打印输出数组中全部元素
2018/03/13 Python
在pandas中一次性删除dataframe的多个列方法
2018/04/10 Python
python lxml中etree的简单应用
2019/05/10 Python
python Django的web开发实例(入门)
2019/07/31 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
Django websocket原理及功能实现代码
2020/11/14 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
COSETTE官网:奢华,每天
2020/03/22 全球购物
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
党的群众路线教育实践方案
2014/05/11 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
司法廉洁教育心得体会
2016/01/20 职场文书
演讲稿之感恩老师(三篇范文)
2019/09/06 职场文书
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js