以前写过一个zip压缩的东东,当时zip包用的是随机名,所以一路顺畅。但是今天下午遇到一个抓狂的问题就是zip程序执行之后没发现生成zip文件,代码并没有报错,折腾半天原来是系统编码问题。目前一般php都是utf8下写的,但是中文win下的ANSI用的是GBK编码,所以还得转GBK。
同样的函数问题还有很多:
file_exists
使用file_exists时如果你文件名或路径含中文,且php在uft8编码时,始终无法检测文件。
同样,filesize和readfile也有问题。basename 等等等等关于文件和文件名的操作。
一般的方法是老生常谈的
iconv转码或者用mb_convert_encoding
为了让测试机和服务器都顺畅的执行所以有以下示例代码:
$fileName="中文名的zip哟";
$this->fileName=$fileName;
$this->fileNameGBK=iconv("utf-8", "GB2312//IGNORE", $this->fileName);
//从服务器上添加文件的路径数组。随便塞点路径进去
$files = array ();
//让basename支持中文
function get_basename($filename){
return preg_replace('/^.+[\\/]/', '', $filename);
}
$zip = new ZipArchive;
//看看是windows还是linux系统
if(stripos($_SERVER['SystemRoot'],'windows')!==false){
$this->zipName=$this->fileNameGBK.".zip";
}else{
$this->zipName=$this->fileName.".zip";
}
$this->zipFilePath=$dir."/".$this->zipName;
//生成并打开zip
$res = $zip->open( $this->zipFilePath, ZIPARCHIVE ::CREATE);
if ($res === TRUE) {
foreach ($files as $v) {
$zip->addFile($v,get_basename($v));
//unlink($v);
}
$zip->close();
//echo 'ok';
} else {
exit('failed:cant open the zip to add file');
}