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 相关文章推荐
教你IIS6的PHP最佳配置方法
Sep 05 PHP
两个强悍的php 图像处理类1
Jun 15 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
symfony表单与页面实现技巧
Jan 26 PHP
php格式化金额函数分享
Feb 02 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
php抓取并保存网站图片的实现代码
Oct 28 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 PHP
php源码 fsockopen获取网页内容实例详解
Sep 24 PHP
php实现的中文分词类完整实例
Feb 06 PHP
PHP观察者模式示例【Laravel框架中有用到】
Jun 15 PHP
THINKPHP5.1 Config的配置与获取详解
Jun 08 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生成excel时单元格内换行问题的解决方法
2010/08/26 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
2011/05/04 PHP
解析PHP多种序列化与反序列化的方法
2013/06/06 PHP
关于PHP的curl开启问题探讨
2014/04/08 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
WordPress中给媒体文件添加分类和标签的PHP功能实现
2015/12/31 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
JQuery的AJAX实现文件下载的小例子
2013/05/15 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
面向切面编程(AOP)的理解
2015/05/01 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
JS实现文档加载完成后执行代码
2015/07/09 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
JavaScript门面模式详解
2017/10/19 Javascript
web前端vue之vuex单独一文件使用方式实例详解
2018/01/11 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
Webpack之tree-starking 解析
2018/09/11 Javascript
VUE简单的定时器实时刷新的实现方法
2019/01/20 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
python抓取京东商城手机列表url实例代码
2013/12/18 Python
Python格式化压缩后的JS文件的方法
2015/03/05 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
python代码实现猜拳小游戏
2020/11/30 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
澳大利亚快时尚鞋类市场:Billini
2018/05/20 全球购物
澳大利亚领先的时尚内衣零售商:Bras N Things
2020/07/28 全球购物
数控专业大学毕业生职业规划范文
2014/02/06 职场文书
逃课上网检讨书
2014/02/20 职场文书
创先争优个人承诺书
2014/08/30 职场文书
民主评议党员登记表自我评价
2014/10/20 职场文书
安全生产奖惩制度
2015/08/06 职场文书