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

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_rscandir$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_rscandir$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->openiconv  'UTF-8', 'GB2312', $zipName));
        if $res === TRUE){
            if !is_diriconv  'UTF-8', 'GB2312', $toDir))) {
                mkdiriconv  '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) {
                    //新建目录
                    mkdiriconv  'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name']), 0777, true);
                } else {
                    //拷贝文件,特别的改动,iconv的位置决定copy能不能work
                    ifcopy'zip://'.iconv  'UTF-8', 'GB2312', $zipName).'#'.$statInfo['name'], iconv  'UTF-8', 'GB2312', $toDir.'/'.$statInfo['name'])) == false){
                        echo 'faild to copy';
                    }
                }
            }

            print_rscandiriconv  'UTF-8', 'GB2312',$toDir)));
            $zip->close);//关闭处理的zip文件
        }
        else{
            echo 'failed, code:'.$res.'<br>';
        }

上述代码的输出:

Array

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

压缩包的目录:

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注