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文件的大小

转载于:https://www.cnblogs.com/dhf327/p/5016666.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值