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 相关文章推荐
PHP 第三节 变量介绍
Apr 28 PHP
php中的常用魔术方法总结
Aug 02 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
php+xml编程之SimpleXML的应用实例
Jan 24 PHP
Linux下从零开始安装配置Nginx服务器+PHP开发环境
Dec 21 PHP
使用PHP下载CSS文件中的所有图片【几行代码即可实现】
Dec 14 PHP
PHP中Trait及其应用详解
Feb 14 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
php 7新特性之类型申明详解
Jun 06 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
php根据地址获取百度地图经纬度的实例方法
Sep 03 PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 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
syphon 虹吸式咖啡冲泡冲煮倒水的得与失
2021/03/03 冲泡冲煮
PHP中的加密功能
2006/10/09 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
2016/11/14 PHP
PHP使用ActiveMQ实现消息队列的方法详解
2019/05/31 PHP
PHP 7.4中使用预加载的方法详解
2019/07/08 PHP
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
详解webpack2+node+react+babel实现热加载(hmr)
2017/08/24 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
浅谈目前可以使用ES10的5个新特性
2019/06/25 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
python将人民币转换大写的脚本代码
2013/02/10 Python
Python多线程和队列操作实例
2015/06/21 Python
python简单分割文件的方法
2015/07/30 Python
Python模拟百度登录实例详解
2016/01/20 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
python异常处理try except过程解析
2020/02/03 Python
详解Python中第三方库Faker
2020/09/25 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
利用CSS3实现动态的二级三级菜单效果实例源码
2017/01/04 HTML / CSS
经典的班主任推荐信
2013/10/28 职场文书
中学生评语大全
2014/04/18 职场文书
给校长的建议书600字
2014/05/15 职场文书
企业宗旨标语
2014/06/10 职场文书
化学教育专业自荐信
2014/07/04 职场文书
房屋出租委托书格式
2014/09/23 职场文书
交通事故委托书范本
2014/09/28 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
美丽人生观后感
2015/06/03 职场文书
引用计数法和root搜索算法以及JVM中判定对象需要回收的方法
2022/04/19 Java/Android