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 相关文章推荐
MYSQL环境变量设置方法
Jan 15 PHP
加速XP搜索功能堪比vista
Mar 22 PHP
php下用GD生成生成缩略图的两个选择和区别
Apr 17 PHP
php框架Phpbean说明
Jan 10 PHP
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
php 过滤器实现代码
Aug 09 PHP
PHPMYADMIN导入数据最大为2M的解决方法
Apr 23 PHP
php数组(array)输出的三种形式详解
Jun 05 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
Feb 15 PHP
php接口实现拖拽排序功能
Apr 23 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
Oct 23 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
超级强大的表单验证
2006/06/26 Javascript
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
Jquery之美中不足小结
2011/02/16 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
js轮盘抽奖实例分析
2020/04/17 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
Vue基于iview实现登录密码的显示与隐藏功能
2020/03/06 Javascript
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
Python是编译运行的验证方法
2015/01/30 Python
Python利用Beautiful Soup模块修改内容方法示例
2017/03/27 Python
python将处理好的图像保存到指定目录下的方法
2019/01/10 Python
在Python中使用turtle绘制多个同心圆示例
2019/11/23 Python
mac使用python识别图形验证码功能
2020/01/10 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
加拿大折扣、优惠券和交易网站:WagJag
2018/02/07 全球购物
Why we need EJB
2016/10/20 面试题
婚庆公司的创业计划书
2014/01/22 职场文书
机械设计毕业生自荐信
2014/02/02 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
2014年保育员工作总结
2014/12/02 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
美丽的大脚观后感
2015/06/03 职场文书
公司仓库管理制度
2015/08/04 职场文书
中秋节随笔
2015/08/15 职场文书
党员理论学习心得体会
2016/01/21 职场文书