解决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("添加失败!");
        }
    }

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

yangshaoyang.cn


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

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

yangshaoyang.cn

将其改为

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

即可。

yangshaoyang.cn


问题解决。

橙色时光
请先登录后发表评论
  • 最新评论
  • 总共0条评论