| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 | <?phpdeclare(strict_types=1);namespace app\utils;use ZipArchive;class ZipUtils{    public function packZip($source, $dest)    {        //判断zip扩展是否加载或者文件目录是否存在        if (!extension_loaded('zip') || !file_exists($source)) {            return false;        }        //创建一个zip打包文件        $zip = new ZipArchive();        if (!$zip->open($dest, ZipArchive::CREATE)) {            return false;        }        $source = str_replace('\\', '/', realpath($source));                if (is_dir($source) === true) {            //创建件一个目录迭代器            $files = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source));            foreach ($files as $file) {                $file = str_replace('\\', '/', $file);                //忽略当前目录和上级目录                if (in_array(substr($file, strrpos($file, '/') + 1), array('.', '..'))) {                    continue;                }                if (is_dir($file) === true) {                    //创建一个子目录                    $zip->addEmptyDir(str_replace($source . '/', '', $file . '/'));                } else if (is_file($file) === true) {                    //创建一个子文件                    $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file));                } else if (is_file($source) === true) {                    //创建文件根目录下的文件                    $zip->addFromString(basename($source), file_get_contents($source));                }            }            $zip->close();        }    }    protected function addFileToZip(string $path,  ZipArchive $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->addFile($path . "/" . $filename);                }            }        }        @closedir($handler);    }    /**     * 删除临时路径     * @param $path     */    public function deleteDir($path)    {        if (is_dir($path)) {            //            $dirs = scandir($path);            foreach ($dirs as $dir) {                if ($dir != '.' | $dir != '..') {                    $sonDir = $path . '/' . $dir;                    if (is_dir($sonDir)) {                        $this->deleteDir($sonDir);                        @rmdir($sonDir);                    } else {                        @unlink($sonDir);                    }                }            }            @rmdir($path);        }    }    /**     * 文件下载     * @param $file     */    public function downLoad($file)    {        if (file_exists($file)) {            $openFile = fopen($file, 'r');            //返回文件类型            Header('Content-type: application/octet-iostream');            //返回文件的字节大小            Header('Accept-Range: bytes');            //返回文件大小            Header('Accept-Length: ' . $file);            //这里对客户端弹出的对话框,对应的文件名            Header('Content-disposition: filename=' . substr($file, strrpos($file, '/') + 1));            $buffer = 1024;            while (!feof($openFile)) {                $file_data = fread($openFile, $buffer);                echo $file_data;            }            fclose($file);            @unlink($file);        } else {            echo '下载文件不存在';        }    }}
 |