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读写文件的方法(生成HTML)
Nov 27 PHP
UCenter Home二次开发指南
May 28 PHP
用php或asp创建网页桌面快捷方式的代码
Mar 23 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 PHP
php 多关键字 高亮显示实现代码
Apr 23 PHP
php Hex RGB颜色值互换的使用
May 10 PHP
php var_export与var_dump 输出的不同
Aug 09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
Jun 25 PHP
php中json_encode UTF-8中文乱码的更好解决方法
Sep 28 PHP
php 模拟 asp.net webFrom 按钮提交事件实例
Oct 13 PHP
功能强大的php分页函数
Jul 20 PHP
php数值计算num类简单操作示例
May 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
从Web查询数据库之PHP与MySQL篇
2009/09/25 PHP
preg_match_all使用心得分享
2014/01/31 PHP
详谈PHP文件目录基础操作
2014/11/11 PHP
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
使用js判断数组中是否包含某一元素(类似于php中的in_array())
2013/12/12 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
JS去除重复并统计数量的实现方法
2016/12/15 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
jsonp跨域请求详解
2017/07/13 Javascript
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
nodejs 使用nodejs-websocket模块实现点对点实时通讯
2018/11/28 NodeJs
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
基于VUE实现判断设备是PC还是移动端
2020/07/03 Javascript
Electron实现应用打包、自动升级过程解析
2020/07/07 Javascript
[00:29]2019完美世界全国高校联赛(秋季赛)总决赛海口落幕
2019/12/10 DOTA
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
Python的自动化部署模块Fabric的安装及使用指南
2016/01/19 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
python3.6的venv模块使用详解
2018/08/01 Python
如何在Django中添加没有微秒的 DateTimeField 属性详解
2019/01/30 Python
使用python打印十行杨辉三角过程详解
2019/07/10 Python
使用WingPro 7 设置Python路径的方法
2019/07/24 Python
Tensorflow 实现释放内存
2020/02/03 Python
使用Python-OpenCV消除图像中孤立的小区域操作
2020/07/05 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
xml有哪些解析技术?区别是什么
2016/04/26 面试题
新大陆软件面试题
2016/11/24 面试题
基督教婚礼主持词
2014/03/14 职场文书
工业设计专业自荐书
2014/06/05 职场文书
法定代表人身份证明书(含说明)
2014/10/02 职场文书
2014年房产销售工作总结
2014/12/08 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
python机器学习Github已达8.9Kstars模型解释器LIME
2021/11/23 Python