日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

下面給大家介紹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 \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('無法打開文件,或者文件創建失敗');
        }
          // 文件夾打包處理
        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 \ZipArchive();
        // 打開文件
        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 Jrk\Zipdown();
    //打包下載
    $zip->zip_file($data);
}



分享到:
標簽:Thinkphp6 ZipArchive打包 下載文件
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定