ThinkPHP实现将本地文件打包成zip下载

5年以前  |  阅读数:384 次  |  编程语言:PHP 

首先,将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分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例