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
如何获取自己想要的域名?有什么做法?字节跳动云服务器怎么设置我在万网买了域名但没备案美国购买云服务器哪个香港服务器好我们收到一个邮箱提示我们域名备案有问题免费cdn2020年购买云服务器秒杀