解决thinkphp上传文件中文命名乱码问题-文件夹乱码

使用thinkphp自带的文件上传类开发中,有上传文件需求,原来不对savename专门命名,使用随机生成的字符串,考虑到用户体验问题,想根据场景,使用姓名+身份证号的形式保存上传文件。

public function add(){
if(!IS_POST){
exit("bad request");
}
$upload = new \Think\Upload();// 实例化上传类
$upload->exts = array('jpg', 'gif', 'png', 'jpeg', 'rar', 'zip');// 设置附件上传类型
$upload->rootPath = './Upload'; // 设置附件上传目录
$upload->savePath = '/file/'; // 设置附件上传(子)目录
$upload->saveName = I('post.name').'_'.I('post.idnum');//上传文件重命名为 姓名_身份证号形式
$info = $upload->upload();
// dump($info);
$file = $info['file']['savepath'].$info['file']['savename'];
if ($file == NULL) {
echo "文件类型错误,请返回修改";
exit();
}
// dump($image);
$data=I('post.');
$data['file']=$file;
// dump($data);exit();
$Model=D("student");
$Model->create();
$num=$Model->add($data);
if($num>0){
$name = I('post.idnum');
$data = M('student');
$id = $data->getFieldByIdnum($name,'id');
session('id',$id);
$this->redirect('/home/form/view/id/'.$id);
}else{
$this->error("添加失败!");
}
}

但存入数据库的文件名正确无误,上传到服务器的文件出现乱码问题。如图

解决thinkphp上传文件中文命名乱码问题

经查,TP3.2.3源码上传驱动未指定存储文件名的字符编码

文件位置: \ThinkPHP\Library\Think\Upload\Driver\Local.class.php 第86行

解决thinkphp上传文件中文命名乱码问题

将其改为

if (!move_uploaded_file($file['tmp_name'], iconv('utf-8','gb2312',$filename)))

即可。

解决thinkphp上传文件中文命名乱码问题

问题解决。

推荐阅读