thinkphp上传文件命名规则 (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的表单乱码,thinkphp设置文件编码格式

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

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

thinkphp的表单乱码,thinkphp设置文件编码格式

将其改为

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

即可。

thinkphp的表单乱码,thinkphp设置文件编码格式

问题解决。