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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
基于asp+ajax和数据库驱动的二级联动菜单
May 06 PHP
PHP中如何调用webservice的实例参考
Apr 25 PHP
探讨PHP调用时间格式的参数详解
Jun 06 PHP
QQ互联一键登录审核不通过的解决方案
Sep 10 PHP
PHP中定义数组常量(array常量)的方法
Nov 17 PHP
php+ajax无刷新上传图片实例代码
Nov 17 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
Apr 23 PHP
php中array_unshift()修改数组key注意事项分析
May 16 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
Nov 16 PHP
php+mysql+ajax实现单表多字段多关键词查询的方法
Apr 15 PHP
PHP依赖注入原理与用法分析
Aug 21 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去除换行(回车换行)的三种方法
2014/03/26 PHP
JavaScript的面向对象(二)
2006/11/09 Javascript
Maps Javascript
2007/01/22 Javascript
仅img元素创建后不添加到文档中会执行onload事件的解决方法
2011/07/31 Javascript
JS不间断向上滚动效果代码
2013/12/25 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
Javascript 高阶函数使用介绍
2015/06/15 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
浅谈js中的变量名和函数名重名
2017/02/13 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
bootstrap日期插件daterangepicker使用详解
2017/10/19 Javascript
JavaScript实现新年倒计时效果
2018/11/17 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
vue prop属性传值与传引用示例
2019/11/13 Javascript
python开发之文件操作用法实例
2015/11/13 Python
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
python实现取余操作的简单实例
2020/08/16 Python
在pycharm中使用pipenv创建虚拟环境和安装django的详细教程
2020/11/30 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
单位门卫岗位职责
2013/12/20 职场文书
优秀通讯员事迹材料
2014/01/28 职场文书
财务主管岗位职责
2014/02/28 职场文书
合作经营协议书范本
2014/04/17 职场文书
学生评语大全
2014/04/18 职场文书
合伙协议书范本
2014/04/21 职场文书
安全教育月活动总结
2014/05/05 职场文书
实习护士自荐信
2014/06/21 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书