今天农成在加班写一个关于学校的管理系统的时候呢,就遇到了几个比较蛋疼的问题。
1、使用PHPword生成word文档的时候呢,就遇到了中文文件名字生成的问题。
解决办法:
$name = iconv('utf-8', 'GB2312//IGNORE', $teacher['name']).'.doc';
$document->save($save_path.'/'.$name);
完美解决。
2、使用PHPzip生成压缩文件的时候,发现压缩不进刚刚生成的中文命名的文档。
打断点跟进了一下这个问题。发现产生的原因有以下几个:
a、使用递归函数遍历文件夹下面的文件的时候,出现了文件漏掉的情况。代码如下:
//获取文件列表
private function list_dir($dir){
$result = array();
if (is_dir($dir)){
$file_dir = scandir($dir);
foreach($file_dir as $file){
$file = iconv('gbk', 'utf-8', $file) ;//这里就是产生漏掉的原因。
if ($file == '.' || $file == '..'){
continue;
}
elseif (is_dir($dir.$file)){
$result = array_merge($result, $this->list_dir($dir.$file.'/'));
}
else{
array_push($result, $dir.$file);
}
}
}
return $result;
}
b、在使用$zip = new ZipArchive;进行压缩的时候,发现中文名字的文件根本就压缩不进去。于是借助了万能的百度和谷歌,通过查看zip的文档。文档地址。发现了以下的问题:
如果文件名包含汉字,ZIPARCHIVE::addFile() 会导致无法将文件压缩到压缩包中,或者压缩以后文件名乱码。
可以使用ZipArchive::addFromString()来实现。
注意:如果操作系统是Windows,文件系统编码是gbk.
如果php文件的文件编码是utf-8,需要相应转码。
ZipArchive::addFile() fails if the filename contains Chinese characters.
ZipArchive::addFromString() should be used instead.
$z= newZipArchive;$file='吴先成.txt';
if($z->open(ZIPARCHIVE::CREATE)===true){$z->addFromString($file,file_get_contents($file));//for windows
//$z->addFromString($file, file_get_contents(iconv('utf-8', 'gbk//ignore', $file)));}// ...
然后就使用以下代码:
//重新生成文件
$zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {
exit('无法打开文件,或者文件创建失败');
}
foreach($datalist as $val){
if(file_exists(iconv('UTF-8','GB2312', $val))){
// $zip->addFile( $val, basename($val));//非中文使用这个
$zip->addFromString(iconv('UTF-8','GB2312', $this->get_basename($val)), file_get_contents(iconv('utf-8', 'gbk//ignore', $val)));//中文使用这个
}
}
$zip->close();//关闭
完成了整个从生成word到压缩下载的曲折过程。