zoukankan      html  css  js  c++  java
  • PHP实现压缩目录zip

    第一步:创建MakeZip类文件

    <?php
    class MakeZip{
    
        /**
         * description:主方法:生成压缩包
         * @author: MY
         * @param $dir_path  想要压缩的目录:如 './demo/'
         * @param $zipName   压缩后的文件名:如 './folder/demo.zip'
         * @return string
         */
        function zip($dir_path, $zipName)
        { 
            $relationArr = array(
                $dir_path => array(
                    'originName' => $dir_path,
                    'is_dir' => true,
                    'children' => array()
                )
            );
    
            $key = array_keys($relationArr);
            $val = array_values($relationArr);
    
            $this->modifiyFileName($dir_path, $relationArr[$dir_path]['children']);
            $zip = new ZipArchive();
            //ZIPARCHIVE::CREATE没有即是创建
            $zip->open($zipName, ZipArchive::CREATE);
            $this->zipDir($key[0], '', $zip, $val[0]['children']);
            $zip->close();
            $this->restoreFileName($key[0], $val[0]['children']);
            return true;
        }
    
        function zipDir($real_path, $zip_path, &$zip, $relationArr)
        {
            $sub_zip_path = empty($zip_path) ? '' : $zip_path . '\';
            if (is_dir($real_path)) {
                foreach ($relationArr as $k => $v) {
                    if ($v['is_dir']) {  //是文件夹
                        $zip->addEmptyDir($sub_zip_path . $v['originName']);
                        $this->zipDir($real_path . '\' . $k, $sub_zip_path . $v['originName'], $zip, $v['children']);
                    } else { //不是文件夹
                        $zip->addFile($real_path . '\' . $k, $sub_zip_path . $k);
                        $zip->deleteName($sub_zip_path . $v['originName']);
                        $zip->renameName($sub_zip_path . $k, $sub_zip_path . $v['originName']);
                    }
                }
            }
        }
    
        function modifiyFileName($path, &$relationArr)
        {
            if (!is_dir($path) || !is_array($relationArr)) {
                return false;
            }
            if ($dh = opendir($path)) {
                $count = 0;
                while (($file = readdir($dh)) !== false) {
                    if(in_array($file,array('.', '..', null))) continue; //无效文件,重来
                    if (is_dir($path . '\' . $file)) {
                        $newName = md5(rand(0, 99999) . rand(0, 99999) . rand(0, 99999) . microtime() . 'dir' . $count);
                        $relationArr[$newName] = array(
                            'originName' => iconv('GBK', 'UTF-8', $file),
                            'is_dir' => true,
                            'children' => array()
                        );
                        rename($path . '\' . $file, $path . '\' . $newName);
                        $this->modifiyFileName($path . '\' . $newName, $relationArr[$newName]['children']);
                        $count++;
                    } else {
                        $extension = strchr($file, '.');
                        $newName = md5(rand(0, 99999) . rand(0, 99999) . rand(0, 99999) . microtime() . 'file' . $count);
                        $relationArr[$newName . $extension] = array(
                            'originName' => iconv('GBK', 'UTF-8', $file),
                            'is_dir' => false,
                            'children' => array()
                        );
                        rename($path . '\' . $file, $path . '\' . $newName . $extension);
                        $count++;
                    }
                }
            }
        }
    
        function restoreFileName($path, $relationArr)
        {
            foreach ($relationArr as $k => $v) {
                if (!empty($v['children'])) {
                    $this->restoreFileName($path . '\' . $k, $v['children']);
                    rename($path . '\' . $k, iconv('UTF-8', 'GBK', $path . '\' . $v['originName']));
                } else {
                    rename($path . '\' . $k, iconv('UTF-8', 'GBK', $path . '\' . $v['originName']));
                }
            }
        }
    }

    第二步:调用index.php文件

    <?php
    /**
     * 下面代码实现把demo目录压缩成zip包,并以demo.zip为名称存储到folder目录
     */
    include_once "./MakeZip.class.php";
    $makeZip = new MakeZip();
    try{
        //重复压缩,则会自动覆盖
        $res = $makeZip->zip('./demo/','./folder/demo.zip');
        if(!$res){
            throw new Exception('压缩失败');
        }
        echo 'success';
    }catch (Exception $e){
        echo $e->getMessage();
    }

    |--补充

    MakeZip类文件中所实例化ZipArchive类 需开启PHP支持ZipArchive
    在php.ini文件中将extension=php_zip.dll  开头的;的去掉。
  • 相关阅读:
    VysorPro助手
    Play 2D games on Pixel running Android Nougat (N7.1.2) with Daydream View VR headset
    Play 2D games on Nexus 6P running Android N7.1.1 with Daydream View VR headset
    Native SBS for Android
    ADB和Fastboot最新版的谷歌官方下载链接
    How do I install Daydream on my phone?
    Daydream Controller手柄数据的解析
    蓝牙BLE传输性能及延迟分析
    VR(虚拟现实)开发资源汇总
    Android(Java)控制GPIO的方法及耗时分析
  • 原文地址:https://www.cnblogs.com/lonmyblog/p/9366749.html
Copyright © 2011-2022 走看看