美文网首页
ThinkPHP框架下如何用PHP自带的ZipArchive类打

ThinkPHP框架下如何用PHP自带的ZipArchive类打

作者: 衡阿大 | 来源:发表于2018-08-20 11:04 被阅读0次

    ThinkPHP框架里有封装好的压缩文件类FileToZip.class,可以参考thinkphp论坛里的帖子。这里用的是PHP自带的ZipArchive类
    PHP端的代码为:

    function packImg(){
          //获取列表 
          $filedir = dirname(dirname(dirname(__FILE__)))."/Upload/";//设置文件路径
          
          $datalist = $this->list_dir($filedir);
          
          $filename = dirname(dirname(dirname(__FILE__)))."/Upload/parentimages.zip"; //最终生成的文件名(含路径) 
    
          /*
              1.先判断文件是否已存在
              2.文件已存在的情况下,则需要删除文件重新生成
              文件是否删除根据需求而定
          */ 
          if (file_exists($filename)) {
              unlink($filename);
           }
          if(!file_exists($filename)){  
          //重新生成文件  
              $zip = new \ZipArchive;//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释 ,这里的反斜杠\一定不要写错,\表示调用的是PHP自带的类,不然会报not find错误
              // print_r($zip);exit; 
              if ($zip->open($filename, \ZipArchive::CREATE)!==TRUE) {  
                  exit('无法打开文件,或者文件创建失败');
              } 
    
              foreach( $datalist as $val){  
                  if(file_exists($val)){  
                      // 往压缩包里添加文件时,有2种方法,被注释的第一种是最常用的,只是我的文件名是中文开头的,压缩后出现乱码,故改用了第二种
                      // $zip->addFile( $val, basename( $val));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下 
                      $fnm = preg_replace('/^.+[\\\\\\/]/', '', $val);
                      $zip->addFromString( $fnm, file_get_contents($val));//压缩文件中含中文的建议使用这个方法
                  }  
              }  
              $zip->close();//关闭  
          }  
          if(!file_exists($filename)){  
              exit("无法找到文件"); //即使创建,仍有可能失败。。。。  
          }  
          header("Cache-Control: public"); 
          header("Content-Description: File Transfer"); 
          header('Content-disposition: attachment; filename='.basename($filename)); //文件名  
          header("Content-Type: application/zip"); //zip格式的  
          header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件  
          header('Content-Length: '. filesize($filename)); //告诉浏览器,文件大小  
          @readfile($filename);
      }
    
      //获取文件列表
      function list_dir($dir){
          $result = array();
          if (is_dir($dir)){
              $file_dir = scandir($dir);
              foreach($file_dir as $file){
                  if ($file == '.' || $file == '..'){
                      continue;
                  }
                  elseif (is_dir($dir.$file)){
                      $result = array_merge($result, list_dir($dir.$file.'/'));
                  }
                  else{
                      // return $file;
                      array_push($result, $dir.$file);
                  }
              }
          }
          return $result;
      }
    

    ZipArchive是PHP自带的扩展类,只是需要开启,Windows和linux开启方法不同。

    相关文章

      网友评论

          本文标题:ThinkPHP框架下如何用PHP自带的ZipArchive类打

          本文链接:https://www.haomeiwen.com/subject/wdonbftx.html