中文的zip壓縮包名和中文的文件名會(huì)導(dǎo)致PHP原生自帶的ZipArchive亂碼,導(dǎo)致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
但是當(dāng)$zipfile是中文編碼時(shí),也就是壓縮包的名稱是中文時(shí),解壓仍然會(huì)失敗。
此時(shí)單獨(dú)再將中文壓縮包名用iconv函數(shù)轉(zhuǎn)碼后再使用:
//zip文件名
$fileName = '中文.zip';
//zip文件相對(duì)服務(wù)器根目錄的保存路徑
$uploads_dir = "/Public/zipUpload";
//zip文件完整的保存路徑
$zipName = $_SERVER['DOCUMENT_ROOT'].$uploads_dir.'/'.$fileName;
//將目標(biāo)路徑名稱賦值為fileName最后的'.zip'四個(gè)字符之外的全部字符構(gòu)成的字符串
$toDir = $_SERVER['DOCUMENT_ROOT'].$uploads_dir.'/'.substr($fileName,0,strlen($fileName)-4);
$zip = new \\\\ZipArchive;//新建一個(gè)ZipArchive的對(duì)象
/*
通過(guò)ZipArchive的對(duì)象處理zip文件
$zip->open這個(gè)方法的參數(shù)表示處理的zip文件名。
如果對(duì)zip文件對(duì)象操作成功,$zip->open這個(gè)方法會(huì)返回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 {
//拷貝文件,特別的改動(dòng),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();//關(guān)閉處理的zip文件
}
else{
echo 'failed, code:'.$res.'<br>';
}
上述代碼的輸出:
Array
(
[0] => .
[1] => ..
[2] => ??
[3] => ?
)
壓縮包的目錄:
中文.zip
├── 不
│ └── 要
│ └── dance.txt
└── 要
└── dance1.txt
更多關(guān)于云服務(wù)器,域名注冊(cè),虛擬主機(jī)的問(wèn)題,請(qǐng)?jiān)L問(wèn)西部數(shù)碼官網(wǎng):m.ps-sw.cn