fastadmin基于ZipArchive生成压缩文件下载到本地

21-05-25     slbcun     900℃     0

PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启。

数据库图片是多图片以字符串的形式保存,需要转换为数组

前台ajax提交id为多选id,返回压缩后的文件地址,然后下载

fastadmin基于ZipArchive生成压缩文件下载到本地

/**
* 整理下载图片
* 复制图片到统一文件夹,以id作为文件夹名称
* $ids 选中的id  [1,2,3]
*/
public function checks($ids = ''){
  $ids = $this->request->post("ids");//页面传值的id
  $id = explode(",", $ids);//字符串转数组
  if (count($id) > 0) {
    $download_name = Random::uuid();//自动生成文件夹名称
    foreach ($id as $v) {
      $row = $this->model->get(['id' => $v]);//查询数据
      $rows = $row->toArray();
      if ($rows['id'] && $rows['group_images']) {//group_images:数据库保存图片的字段
        $dir = iconv("UTF-8", "GBK", "./ziprar/" . $download_name . "/" . $rows['id']);//图片文件夹放在根目录ziprar里面
        if (!file_exists($dir)) {//创建文件夹
          mkdir($dir, 0777, true);
        }
        $gimgs = explode(",", $rows['group_images']);//图片路径整理
        foreach ($gimgs as $vs) {
          $name_imgs = explode("/", $vs);
          $names_imgs = $name_imgs['3'];
          $old_img = ROOT_PATH . 'public' . $vs;
          $new_img = "./ziprar/" . $download_name . "/" . $rows['id'] . "/" . $names_imgs;
          if (!file_exists($new_img)) {
            copy($old_img, $new_img);//复制图片
          }
        }
      }
    }
    $this->zips($download_name);
  }
}
/**
* 压缩文件夹
*/
function addFileToZip($path,$zip){
  $handler=opendir($path); //打开当前文件夹$path指定的路径。
  while(($filename=readdir($handler))!==false){
      if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..',不要对他们进行操作
        if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
          $this->addFileToZip($path."/".$filename, $zip);
        }else{ //将文件加入zip对象
          $zip->addFile($path."/".$filename);
        }
      }
    }
  @closedir($path);
}
/**
* 使用ZipArchive生成压缩文件
*/
public function zips($download_name){
  $zip=new \ZipArchive();
  if($zip->open("./ziprar/".$download_name.'.zip', \ZipArchive::CREATE) === TRUE){
      $this->addFileToZip("./ziprar/$download_name"., $zip);
      $zip->close(); //关闭处理的zip文件
  }
  //判断域名是http还是https
  if ( !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') {
    $h= 'https://'.$_SERVER['HTTP_HOST'];
  } elseif ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) {
    $h= 'https://'.$_SERVER['HTTP_HOST'];
  } elseif ( !empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') {
    $h= 'https://'.$_SERVER['HTTP_HOST'];
  }else{
    $h= 'http://'.$_SERVER['HTTP_HOST'];
  }
  $url = $h."/ziprar/".$download_name.".zip";
  //下载文件名
  $file_dir = ROOT_PATH . 'public/ziprar/' .$download_name.'.zip';
  $this->deldir(ROOT_PATH . 'public/ziprar/' .$download_name.'/');
  $this->success('压缩成功,下载中...', $url,'压缩成功');
}
/**
* 删除文件夹,只保留压缩文件
*/
function deldir($dir) {
  //先删除目录下的文件:
  $dh=opendir($dir);
  while ($file=readdir($dh)) {
    if($file!="." && $file!="..") {
      $fullpath=$dir."/".$file;
      if(!is_dir($fullpath)) {
        unlink($fullpath);
      } else {
        $this->deldir($fullpath);
      }
    }
  }
  closedir($dh);
  //删除当前文件夹:
  if(rmdir($dir)) {
    return true;
  } else {
    return false;
  }
}


分享 收藏
发表我的评论

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~