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 相关文章推荐
建立动态的WML站点(二)
Oct 09 PHP
小偷PHP+Html+缓存
Dec 20 PHP
PHP Mysql编程之高级技巧
Aug 27 PHP
php foreach 使用&amp;(与运算符)引用赋值要注意的问题
Feb 16 PHP
PHP中基本符号及使用方法
Mar 23 PHP
PHP 二维数组和三维数组的过滤
Mar 16 PHP
PHP预定义变量9大超全局数组用法详解
Apr 23 PHP
Laravel框架实现的记录SQL日志功能示例
Jun 19 PHP
ThinkPHP5+Layui实现图片上传加预览功能
Aug 17 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
Nov 23 PHP
关于PHP求解三数之和问题详析
Nov 09 PHP
PHP设计模式(观察者模式)
Jul 07 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生成便于打印的网页
2006/10/09 PHP
上传多个文件的PHP脚本
2006/11/26 PHP
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
php列出一个目录下的所有文件的代码
2012/10/09 PHP
ThinkPHP实现将本地文件打包成zip下载
2014/06/26 PHP
php的ZipArchive类用法实例
2014/10/20 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
js 禁止选择功能实现代码(兼容IE/Firefox)
2010/04/23 Javascript
Js nodeType 属性全面解析
2013/11/14 Javascript
jquery用data方法获取某个元素上的事件
2014/06/23 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
使用Python的内建模块collections的教程
2015/04/28 Python
Python操作SQLite数据库的方法详解
2017/06/16 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
Python实现最常见加密方式详解
2019/07/13 Python
pytorch forward两个参数实例
2020/01/17 Python
Python多线程多进程实例对比解析
2020/03/12 Python
python判断正负数方式
2020/06/03 Python
python 6种方法实现单例模式
2020/12/15 Python
如何通过python检查文件是否被占用
2020/12/18 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
新法人代表任命书
2014/06/06 职场文书
七年级地理教学计划
2015/01/22 职场文书
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android