zoukankan      html  css  js  c++  java
  • PHP 解压zip文件的函数封装

        /**
         * zip文件解压
         *
         * @param $zipFilePath      zip文件的路径,可以不加zip文件后缀.如果其他类型的文件伪装成zip解压也会失败
         * @param $directoryPath    解压到的文件夹路径
         * @param null $fileExtensionArray    允许解压的文件后缀名数组,默认为null,解压任何类型的文件
         *
         * @return bool        解压失败返回false,成功返回true
         */
        function unZipFile($zipFilePath, $directoryPath, $fileExtensionArray = null) {
    
            if (!file_exists($zipFilePath)) {
                return false;
            }
    
            if (!is_dir($directoryPath)) {
                
                // 解压后是不允许执行的,但是任何人可以读写,方便处理
                if (!mkdir($directoryPath, 0666, true)) {
                    return false;
                }
            }
    
            $resource = zip_open($zipFilePath);
    
            // 其他类型的文件伪装成zip文件时出现此种情况
            if (is_numeric($resource)) {
                return false;
            }
    
            while ($dir_resource = zip_read($resource)) {
                if (!zip_entry_open($resource, $dir_resource)) {
                    continue;
                }
    
                $file_name = $directoryPath . zip_entry_name($dir_resource);
                $file_path = substr($file_name, 0, strrpos($file_name, '/'));
    
                if (!is_dir($file_path)) {
                    if (!mkdir($file_path, 0666, true)) {
                        return false;
                    }
                }
    
                if (is_dir($file_name)) {
                    zip_entry_close($dir_resource);
                    continue;
                }
    
                if (isset($fileExtensionArray) && count($fileExtensionArray) > 0) {
                    if (!in_array(pathinfo($file_name, PATHINFO_EXTENSION), $fileExtensionArray)) {
                        continue;
                    }
                }
    
                $file_size = zip_entry_filesize($dir_resource);
                $file_content = zip_entry_read($dir_resource, $file_size);
                file_put_contents($file_name, $file_content);
    
                zip_entry_close($dir_resource);
            }
            zip_close($resource);
            return true;
        }

    5.4 下测试通过,其他的情况可以扩展此函数即可,如限制zip文件的大小

  • 相关阅读:
    map,forEach,some,every,filter条件过滤的区别
    dangerouslySetInnerHTML空格不换行解决方案
    react项目里link语法报错Dangerous property 'dangerouslySetInnerHTML'
    如何判断两个数组是否相等相等
    react hooks的缺点(针对状态不同步和没有生命周期)
    面试聊啥
    Win10 PIN码是什么?如何设置?
    三个环形图(万一是n个呢)
    Chrome 离线加装扩展的新方法
    java安装
  • 原文地址:https://www.cnblogs.com/dhf327/p/5016666.html
Copyright © 2011-2022 走看看