视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
如何解决php zip解压乱码的问题
2020-11-02 18:26:46 责编:小采
文档


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

推荐:《PHP视频教程》

测试环境是windows7

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

<?php
$zip = new ipArchive;
$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 ipArchive;
$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 ipArchive;//新建一个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

下载本文
显示全文
专题