>PHP 프레임워크 >ThinkPHP >Thinkphp6이 ZipArchive를 사용하여 파일을 패키지하고 다운로드하는 방법

Thinkphp6이 ZipArchive를 사용하여 파일을 패키지하고 다운로드하는 방법

藏色散人
藏色散人앞으로
2020-08-22 13:16:084332검색

프레임워크 튜토리얼 칼럼에서 소개한 것입니다. 도움이 필요한 친구들에게 도움이 되길 바랍니다! 기본 환경

시스템 환경: Windows10 x64
  • PHP 통합 환경:
      phpstudy
    • PHP 종속성 관리 도구: ComposerManual: Thinkphp
( 1) tp6 프레임워크 다운로드

composer create-project topthink/think tp6

(2) 패키지 다운로드형

<?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 = &#39;&#39;, $wen = true,$isDown = true){

        $zip_file_path=&#39;zip/&#39;;
        // 文件名为空则生成文件名
        if (empty($zipName)) {
            $zipName = $zip_file_path.date(&#39;YmdHis&#39;) . &#39;.zip&#39;;
        }else{
            $zipName=$zip_file_path.$zipName.&#39;.zip&#39;;
        }

        // 实例化类,使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
        $zip = new \ZipArchive;
        /*
        * 通过ZipArchive的对象处理zip文件
        * $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
        * $zip->open这个方法第一个参数表示处理的zip文件名。
        * 这里重点说下第二个参数,它表示处理模式
        * ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。
        * ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效
        * */
        if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE) !== true) {
            exit(&#39;无法打开文件,或者文件创建失败&#39;);
        }

              // 文件夹打包处理
           if (is_string($files)) {
                // 文件夹整体打包
                $this->addFileToZip($files, $zip);
            } else {
                 // 文件打包
                foreach ($files as $val) {
                    if(file_exists(app()->getRootPath().&#39;public&#39;.$val[&#39;att_dir&#39;])){
                        if($wen){
                            //根据存储的文件夹打包分层
                            $zip->addFile(app()->getRootPath().&#39;public&#39;.$val[&#39;att_dir&#39;], iconv(&#39;UTF-8&#39;,&#39;gbk&#39;,$val[&#39;img_dir&#39;].&#39;/&#39;.$val[&#39;name&#39;]));
                        }else{
                            //不分层
                            $zip->addFile(app()->getRootPath().&#39;public&#39;.$val[&#39;att_dir&#39;], iconv(&#39;UTF-8&#39;,&#39;gbk&#39;,$val[&#39;name&#39;]));
                        }
                    }
                }
            }
            // 关闭
            $zip->close();

            // 验证文件是否存在
            if (!file_exists($zipName)) {
                exit("文件不存在");
            }

        if ($isDown) {
            // ob_clean();
             // 下载压缩包
             header("Cache-Control: public");
             header("Content-Description: File Transfer");
             header(&#39;Content-disposition: attachment; filename=&#39; . basename($zipName)); //文件名
             header("Content-Type: application/zip"); //zip格式的
             header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
             header(&#39;Content-Length: &#39; . filesize($zipName)); //告诉浏览器,文件大小
             @readfile($zipName);//ob_end_clean();
             @unlink(app()->getRootPath().&#39;public/&#39;.$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(&#39;gb2312&#39;, &#39;utf-8&#39;, $filename);
                   // 文件夹文件名字为&#39;.&#39;和‘..’,不要对他们进行操作
                   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 \ZipArchive();
           // 打开文件
           if (!$zipArc->open($file)) {
               return false;
           }
           // 解压文件
           if (!$zipArc->extractTo($dirname)) {
               // 关闭
               $zipArc->close();
               return false;
           }
           return $zipArc->close();
       }
    }

(3) 사용, 개인 테스트가 유효

 /**
     * @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(&#39;id&#39;, &#39;in&#39;,$ids)->select()->toArray();
        //dd($data);

        if (empty($data)) {
            $this->error("暂无数据");
        }
        $zip=new Jrk\Zipdown();
        //打包下载
         $zip->zip_file($data);
    }

위 내용은 Thinkphp6이 ZipArchive를 사용하여 파일을 패키지하고 다운로드하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제