• 技术文章 >后端开发 >PHP问题

    如何解决php zip解压乱码的问题

    藏色散人藏色散人2020-08-24 10:37:49原创1653

    php zip解压乱码的解决办法:首先将中文压缩包名用iconv函数转码;然后通过ZipArchive的对象处理zip文件;最后关闭处理的zip文件即可。

    推荐:《PHP视频教程

    测试环境是windows7

    中文的zip压缩包名和中文的文件名会导致PHP原生自带的ZipArchive乱码,导致extractTo方法失效:

    <?php
    $zip = new \ZipArchive;
    $zipfile = "./test.zip";
    $res = $zip->open($zipfile);
    $toDir = "./test";
    $s = $zip->extractTo($toDir);
    print_r(scandir($toDir));
    //作者:Dorm_Script
    //链接:http://www.jianshu.com/p/3efa924fd809

    参考一篇blog,原作的解决办法是:

    <?php
    $zip = new \ZipArchive;
    $zipfile = "./test.zip";
    $res = $zip->open($zipfile);
    
    $toDir = "./test";
    if(!file_exists($toDir)) {
        mkdir($toDir);
    }
    $docnum = $zip->numFiles;
    for($i = 0; $i < $docnum; $i++) {
        $statInfo = $zip->statIndex($i);
        if($statInfo['crc'] == 0) {
            //新建目录
            mkdir($toDir.'/'.substr($statInfo['name'], 0,-1));
        } else {
            //拷贝文件
            copy('zip://'.$zipfile.'#'.$statInfo['name'], $toDir.'/'.$statInfo['name']);
        }
    }
    
    print_r(scandir($toDir));
    
    //作者:Dorm_Script
    //链接:http://www.jianshu.com/p/3efa924fd809

    但是当$zipfile是中文编码时,也就是压缩包的名称是中文时,解压仍然会失败。

    此时单独再将中文压缩包名用iconv函数转码后再使用

            //zip文件名
            $fileName = '中文.zip';
            //zip文件相对服务器根目录的保存路径
            $uploads_dir = "/Public/zipUpload";
    
            //zip文件完整的保存路径
            $zipName = $_SERVER['DOCUMENT_ROOT'].$uploads_dir.'/'.$fileName;
            //将目标路径名称赋值为fileName最后的'.zip'四个字符之外的全部字符构成的字符串
            $toDir = $_SERVER['DOCUMENT_ROOT'].$uploads_dir.'/'.substr($fileName,0,strlen($fileName)-4);
    
            $zip = new \ZipArchive;//新建一个ZipArchive的对象
            /*
            通过ZipArchive的对象处理zip文件
            $zip->open这个方法的参数表示处理的zip文件名。
            如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
            */
            $res = $zip->open(iconv ( 'UTF-8', 'GB2312', $zipName));
            if ($res === TRUE){
                if (!is_dir(iconv ( 'UTF-8', 'GB2312', $toDir))) {
                    mkdir(iconv ( 'UTF-8', 'GB2312', $toDir), 0777, true);
                }
                //$zip->extractTo($toDir);
                $docnum = $zip->numFiles;
                for($i = 0; $i < $docnum; $i++) {
                    $statInfo = $zip->statIndex($i);
                    if($statInfo['crc'] == 0) {
                        //新建目录
                        mkdir(iconv ( 'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name']), 0777, true);
                    } else {
                        //拷贝文件,特别的改动,iconv的位置决定copy能不能work
                        if(copy('zip://'.iconv ( 'UTF-8', 'GB2312', $zipName).'#'.$statInfo['name'], iconv ( 'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name'])) == false){
                            echo 'faild to copy';
                        }
                    }
                }
    
                print_r(scandir(iconv ( 'UTF-8', 'GB2312',$toDir)));
                $zip->close();//关闭处理的zip文件
            }
            else{
                echo 'failed, code:'.$res.'<br>';
            }

    上述代码的输出:

    Array
    (
        [0] => .
        [1] => ..
        [2] => ��
        [3] => Ҫ
    )

    压缩包的目录:

     中文.zip
    ├── 不
    │   └── 要
    │       └── dance.txt
    └── 要
        └── dance1.txt

    以上就是如何解决php zip解压乱码的问题的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 乱码
    上一篇:php中$符号是什么意思 下一篇:cpanel如何修改php.ini
    千万级数据并发解决方案

    相关文章推荐

    • Linux系统下如何解压zip文件• 不支持php zip怎么办• 如何解决“您的服务器不支持php zip”问题• Thinkphp6如何利用ZipArchive打包下载文件
    1/1

    PHP中文网