Linux环境PHP解压缩ZipArchive中的extractTo()方法,解压zip时文件丢失的问题

在实际项目中要用ZipArchive解压ZIP文件,起初測试环境在Win环境中,測试通过,换到 LINUX 的环境中时 就出问题了(ZIP包中有文件和目录,包含带汉字的文件名称) 问题的现象是:不带汉字的文件解压没有问题,另外有部分带汉字和数字字母的文件解压没有问题,然后其它纯文字的文件名称就丢失了,也没有报错,最后把问题定位到了extractTo()方法,这种方法是个封装的方法,看不到实际的源码。 经Google一番后,发现使用` getNameIndex `和` numFiles `

Linux环境PHP解压缩ZipArchive中的extractTo()方法,解压zip时文件丢失的问题

在实际项目中要用ZipArchive解压ZIP文件,起初測试环境在Win环境中,測试通过,换到 LINUX 的环境中时 就出问题了(ZIP包中有文件和目录,包含带汉字的文件名称)

问题的现象是:不带汉字的文件解压没有问题,另外有部分带汉字和数字字母的文件解压没有问题,然后其它纯文字的文件名称就丢失了,也没有报错,最后把问题定位到了extractTo()方法,这种方法是个封装的方法,看不到实际的源码。

经Google一番后,发现使用getNameIndexnumFiles可找到所有的文件,循环遍历使用copy方法进行中文转码

核心代码

for($i = 0; $i < $zip->numFiles; $i++) {
    $filename = $zip->getNameIndex($i);
    if(!is_dir($filename)){
        //需要将目标地址转码
        $to = iconv("gbk", "utf-8//IGNORE", $topath.$filename);
        copy("zip://".$path."#".$filename, $to);
    }else{
        @mkdir($topath.'/'.$filename, 0777);
    }
}     

另一种方法使用unzip命令解压,解决中文解压乱码问题,命令如下:

export LC_ALL=zh_CN.UTF-8 && /usr/bin/unzip  -o test.zip -d test 2>&1

被搞了一天,能解决就是进步~

上一篇:php项目中调用Linux命令zip和unzip 下一篇:MySQL查询表结构命令

评论

评论(4)

暂无评论