下面的代码是我在Thinkphp3.1.2文件上传类UploadFile.class.php中upload()方法156行——218行上,在原代码(160、166、173行)进行修改。注意注释部分“//改进后的:支持中文路径”三行代码是修改后的,对比修改后完美支持中文名文件上传。
修改后的代码如下:
/**
* 上传所有文件
* @access public
* @param string $savePath 上传文件保存路径
* @return string
*/
public function upload($savePath ='') {
//如果不指定保存文件名,则由系统默认
if(empty($savePath)) $savePath = $this->savePath;
// 检查上传目录
if(!is_dir(iconv('utf-8', 'gbk',$savePath ))) {//改进后的:支持中文路径
// 检查目录是否编码后的
if(is_dir(ba
$savePath = ba
}else{
// 尝试创建目录
if(!mkdir(iconv('utf-8', 'gbk',$savePath ))){//改进后的:支持中文路径
$this->error = '上传目录'.$savePath.'不存在';
return false;
}
}
}else {
if(!is_writeable(iconv('utf-8', 'gbk',$savePath ))) {//改进后的:支持中文路径
$this->error = '上传目录不可写';
return false;
}
}
$fileInfo = array();
$isUpload = false;
// 获取上传的文件信息
// 对$_FILES数组信息处理
$files = $this->dealFiles($_FILES);
foreach($files as $key => $file) {
//过滤无效的上传
if(!empty($file['name'])) {
//登记上传文件的扩展信息
if(!isset($file['key'])) $file['key'] = $key;
$file['extension'] = $this->getExt($file['name']);
$file['savepath'] = $savePath;
$file['savename'] = $this->getSaveName($file);
// 自动检查附件
if($this->autoCheck) {
if(!$this->check($file))
return false;
}
//保存上传文件
if(!$this->save($file)) return false;
if(function_exists($this->hashType)) {
$fun = $this->hashType;
$file['hash'] = $fun($this->autoCharset($file['savepath'].$file['savename'],'utf-8','gbk'));
}
//上传成功后保存文件信息,供其他地方调用
unset($file['tmp_name'],$file['error']);
$fileInfo[] = $file;
$isUpload = true;
}
}
if($isUpload) {
$this->uploadFileInfo = $fileInfo;
return true;
}else {
$this->error = '没有选择上传文件';
return false;
}
}
最佳答案
