測試環境是windows10
中文的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));
<?php
$zip = new \ziparchive;
$zipfile = "./test.zip";
$res = $zip->open($zipfile);
$todir = "./test";
if(!file_exists($todir))
$docnum = $zip->numfiles;
for($i = 0; $i
< $docnum; $i++) else
}print_r(scandir($todir));
但是當$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)
//$zip->extractto($todir);
$docnum = $zip->numfiles;
for($i = 0; $i
< $docnum; $i++) else }}
print_r(scandir(iconv ( 'utf-8', 'gb2312',$todir)));
$zip->close();//關閉處理的zip檔案
}else
上述**的輸出:
array
( [0] => .
[1] => ..
[2] => ��
[3] => ҫ
)
壓縮包的目錄:
中文.zip
├── 不
│ └── 要
│ └── dance.txt
└── 要
└── dance1.txt
PHP上傳ZIP壓縮包並解壓
因為專案上面的需要,所以研究了php解壓壓縮包,當然php不止這一種解壓方式,個人覺得是比較方便的辦法,不需要安裝其他的擴充套件。獲取表單提交的壓縮檔案 file files file 獲取檔名 name file name 獲取絕對路徑 path getcwd 定義檔案儲存路徑 filepath ...
zip壓縮包解壓亂碼問題
由於zip格式中並沒有指定編碼格式,windows下生成的zip檔案中的編碼是gbk gb2312等,因此,導致這些zip檔案在linux下解壓時出現亂碼問題,因為linux下的預設編碼是utf8。目前網上流傳一種unzip o cp936的方法,但一些unzip是沒有 o這個選項的。unzip o...
PHP生成zip壓縮包
我們將乙個檔案生成乙個壓縮包。path c wamp www log.txt filename test.zip zip new ziparchive zip open filename,ziparchive create 開啟壓縮包 zip addfile path,basename path 向...