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
《PHP编程最快明白》第八讲:php启发和小结
Nov 01 PHP
JS与PHP向函数传递可变参数的区别实例代码
May 18 PHP
PHP静态文件生成类实例
Nov 29 PHP
php使用pdo连接mssql server数据库实例
Dec 25 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
php构造函数与析构函数
Apr 23 PHP
PHP处理CSV表格文件的常用操作方法总结
Jul 01 PHP
关于Laravel Route重定向的一个注意点
Jan 16 PHP
PHP判断密码强度的方法详解
May 26 PHP
解决Laravel blade模板转义html标签的问题
Sep 03 PHP
php输出形式实例整理
May 05 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小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
php中memcache 基本操作实例
2015/05/17 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
因str_replace导致的注入问题总结
2019/08/08 PHP
将nodejs打包工具整合到鼠标右键的方法
2013/05/11 NodeJs
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
jQuery中detach()方法用法实例
2014/12/25 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
Electron 打包问题:electron-builder 下载各种依赖出错(推荐)
2020/07/09 Javascript
如何HttpServletRequest文件对象并储存
2020/08/14 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
[09:13]DOTA2-DPC中国联赛 正赛 Ehome vs Magma 选手采访 1月19日
2021/03/11 DOTA
Python3.2中的字符串函数学习总结
2015/04/23 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
python学生信息管理系统
2018/03/13 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
在Python3 numpy中mean和average的区别详解
2019/08/24 Python
Python列表切片常用操作实例解析
2020/03/10 Python
CSS3 分类菜单效果
2019/05/27 HTML / CSS
解决HTML5中滚动到底部的事件问题
2019/08/22 HTML / CSS
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
巴西购物网站:Estrela10
2018/12/13 全球购物
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
会计职业生涯规划书
2014/01/13 职场文书
美食节目策划方案
2014/05/31 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
查摆问题整改措施
2014/10/24 职场文书
2014年司机工作总结
2014/11/21 职场文书
使用react+redux实现计数器功能及遇到问题
2021/06/02 Javascript