问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

thinkphp中怎样调用php自带的压缩解压缩类

发布网友 发布时间:2022-04-06 04:12

我来回答

2个回答

懂视网 时间:2022-04-06 08:33

下面由thinkphp框架教程栏目给大家介绍Thinkphp6利用ZipArchive打包下载文件的方法,希望对需要的朋友有所帮助!

  • 基础环境
  • 系统环境:Windows10 x64
  • PHP集成环境:phpstudy
  • PHP依赖管理工具:Composer
  • 手册:Thinkphp
  • (一) 下载tp6框架

    composer create-project topthink/think tp6

    (二)打包下载类

    <?php
     namespace Jrk;
    
     class Zipdown
     {
     /**
     * 打包压缩文件及文件夹
     *
     * @Author Hhy <jackhhy520@qq.com>
     * @DateTime 2020-07-10 13:20:06
     * @param array $files
     * @param string $zipName 压缩包名称
     * @param boolean $wen 
     * @param boolean $isDown
     * @return void
     */ 
     public function zip_file($files = [], $zipName = '', $wen = true,$isDown = true){
    
     $zip_file_path='zip/';
     // 文件名为空则生成文件名
     if (empty($zipName)) {
      $zipName = $zip_file_path.date('YmdHis') . '.zip';
     }else{
      $zipName=$zip_file_path.$zipName.'.zip';
     }
    
     // 实例化类,使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
     $zip = new ipArchive;
     /*
     * 通过ZipArchive的对象处理zip文件
     * $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
     * $zip->open这个方法第一个参数表示处理的zip文件名。
     * 这里重点说下第二个参数,它表示处理模式
     * ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。
     * ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效
     * */
     if ($zip->open($zipName, IPARCHIVE::OVERWRITE | IPARCHIVE::CREATE) !== true) {
      exit('无法打开文件,或者文件创建失败');
     }
    
      // 文件夹打包处理
      if (is_string($files)) {
      // 文件夹整体打包
      $this->addFileToZip($files, $zip);
      } else {
       // 文件打包
      foreach ($files as $val) {
       if(file_exists(app()->getRootPath().'public'.$val['att_dir'])){
       if($wen){
        //根据存储的文件夹打包分层
        $zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['img_dir'].'/'.$val['name']));
       }else{
        //不分层
        $zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['name']));
       }
       }
      }
      }
      // 关闭
      $zip->close();
    
      // 验证文件是否存在
      if (!file_exists($zipName)) {
      exit("文件不存在");
      }
    
     if ($isDown) {
      // ob_clean();
      // 下载压缩包
      header("Cache-Control: public");
      header("Content-Description: File Transfer");
      header('Content-disposition: attachment; filename=' . basename($zipName)); //文件名
      header("Content-Type: application/zip"); //zip格式的
      header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
      header('Content-Length: ' . filesize($zipName)); //告诉浏览器,文件大小
      @readfile($zipName);//ob_end_clean();
      @unlink(app()->getRootPath().'public/'.$zipName);//删除压缩包
    
      } else {
      // 直接返回压缩包地址
      return $zipName;
      }
     }
    
     /**
     * 添加文件至压缩包
     * @Author Hhy <jackhhy520@qq.com>
     * @DateTime 2020-07-10 13:20:26
     * @param [type] $path
     * @param [type] $zip
     * @return void
     */ 
     public function addFileToZip($path, $zip)
     {
      // 打开文件夹
      $handler = opendir($path);
      while (($filename = readdir($handler)) !== false) {
      if ($filename != "." && $filename != "..") {
       // 编码转换
       $filename = iconv('gb2312', 'utf-8', $filename);
       // 文件夹文件名字为'.'和‘..’,不要对他们进行操作
       if (is_dir($path . "/" . $filename)) {
       // 如果读取的某个对象是文件夹,则递归
       $this->addFileToZip($path . "/" . $filename, $zip);
       } else {
       // 将文件加入zip对象
       $file_path = $path . "/" . $filename;
       $zip->addFile($file_path, basename($file_path));
       }
      }
      }
      // 关闭文件夹
      @closedir($path);
     }
    
     /**
     * 压缩文件解压
     *
     * @Author Hhy <jackhhy520@qq.com>
     * @DateTime 2020-07-10 13:23:11
     * @param [type] $file
     * @param [type] $dirname
     * @return void
     */
     public function unzip_file($file, $dirname)
     {
      if (!file_exists($file)) {
      return false;
      }
      // zip实例化对象
      $zipArc = new ipArchive();
      // 打开文件
      if (!$zipArc->open($file)) {
      return false;
      }
      // 解压文件
      if (!$zipArc->extractTo($dirname)) {
      // 关闭
      $zipArc->close();
      return false;
      }
      return $zipArc->close();
     }
     }

    (三)使用,亲测有效

     /**
     * @author: Hhy <jackhhy520@qq.com>
     * @date: 2020/7/2 0002
     * @describe:打包下载
     */
     public function download(){
     $id= $this->request->param("id");
     if (is_array($id)){
      $ids=$id;
     }else{
      $ids=@explode(",",$id);
     }
     $data=$this->model->where('id', 'in',$ids)->select()->toArray();
     //dd($data);
    
     if (empty($data)) {
      $this->error("暂无数据");
     }
     $zip=new Jrkipdown();
     //打包下载
      $zip->zip_file($data);
     }

    热心网友 时间:2022-04-06 05:41

    命名空间加上use ZipArchive;
    下面直接实例化$zip = new ZipArchive;
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    什么叫补按揭 后按揭贷款什么意思 买房者续按揭有什么危害 加按揭是什么意思 八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? thinkphp5 怎么打包指定文件 rar 或者 zip thinkphp的文件下载怎么实现,急需具体的代码 有没有办法让表中的记录上下移动 IE缓存和历史记录到底有什么区别,保留哪一个能使下次访问这些网页速度变快 .在SQL语言中,要一条记录使用的是:() 求日记30篇。300字就行!记住是日记!记录每天的事! 有没有这样的安卓应用,点击一下记录此刻时间 然后可以添加描述 比如08:00 起床了 09:12 平时想记录一下家庭的美好日常,有没有什么相机拍摄、录像不错的,不要太贵哈! 手机上有没有一种软件,把想记录的资料记录下来,用的时候搜索一下就找到了 除了历史记录,还有什么可以记录使用电脑的记录? 用什么软件记录下一个好的语段? 晌心谷:记录一下我与小白劲炫ASX的五一游记 你还知道其他的生活小窍门吗搜集一下并记录下来吧生活小窍门信息来源效果? 前几天做了雀斑激光,来记录一下变化过程 在家宅得无聊,记录一下和小黑的碎碎念——广汽丰田iA5使用心得 周亚夫军细柳以第一人称视角记录一下此次劳军的所见所闻 记录下 用英语怎么说 2022年第一次穿短袖记录一下用什么话术发朋友圈最好 举三个使你心情愉悦的运动事例回忆一下记录下来形成一篇心得 平面设计师如何找到自己的核心竞争力? thinkphp的http::download怎么做下载文件 thinkphp3.2文件打包怎么做 thinkphp怎样下载远程服务器上的文件 Thinkphp 5怎么引入css,js文件? thinkphp怎么引用钉钉配置文件包 thinkphp 文件夹到底该怎么放置 thinkphp如何记录下载次数 thinkphp怎么将文件夹压缩成zip python的selenium爬虫怎么换代理 找不到config.inc.php没有config.inc.php这个文件 config.inc.php文件在哪 config.inc.php在哪 论坛config.inc.php 怎么查看 phpMyAdmin-2.10.0.2-all-languages.tar.gz版本里的找不config.inc.php config.inc.php文件在网站哪里 php 中的 config.inc.php 为什么我的mysql没有config.inc.php配置文件 我下载的phpMyAdmin没有config.inc.php phpcms config.inc.php在哪 config.inc.php这个东西在根目录的哪个下面