• ThinkPHP文件上传验证器


    在thinkphp中的文件上传功能,添加验证器的过程中.踩得小坑,简单记录。
    具体内容如下

    代码如下.
    视图层 就是简单的form表单,用来上传文件。

    <form action="/admin/files/upFile" enctype="multipart/form-data" method="post">
            <input type="file" name="image" /> <br>
            <button  type="submit" >上传 button>
        form>
    
    • 1
    • 2
    • 3
    • 4

    控制器层用来接收传进来的数据以及返回信息.

    public function upFile(){
            if (\request()->method() == "POST") {
                $file = request()->file();
    //            halt($file);
                $rt = \app\admin\model\Files::uploadFile($file);
                if ($rt['code'] == 0) {
                    $this->success($rt['msg']);
                } else {
                    $this->error($rt['msg']);
                }
            }
                $this->error("错误的请求方法","/index");
    //        halt($file);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    这里我将具体的处理代码放在了模型当中。存在问题的代码如下,

    public static function uploadFile($file)
        {
            try {
                //定义上传文件大小
                $size = 2000*1024;
                //验证器检测
                validate(['image'=>"image|fileSize:$size"])->check($file);
                //保存文件 到public配置下的avatar目录下
                $savename = \think\facade\Filesystem::disk("public")->putFile( 'avatar', $file);
    //            halt($savename);
                //定义数组信息
                $arr = ["code"=>0,'msg'=>"上传成功"];
            }catch (ValidateException $e){
                $arr = ["code"=>0,'msg'=>$e->getError()];
            }catch (\Exception $e){
                $arr = ["code"=>2,'msg'=>'系统错误'];
            }
            return $arr;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    问题出现的原因主要是validate验证器接收的只能为数组,那么我就在控制器传入参数的时候,传入的内容就为数组.
    $file = request()->file(); 即未去定义name, halt输出可以看到** f i l e ∗ ∗ 为数组。 ! [ 在这里插入图片描述 ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / 399 a a 0717 b 9 c 490 f 8292 a 9 a d a 126 f 879. p n g ) 验证器验证正常 , 但是 ‘ p u t F i l e ‘ 方法就会产生如下错误。 ! [ 在这里插入图片描述 ] ( h t t p s : / / i m g − b l o g . c s d n i m g . c n / f 92 b a e 9 d 022 e 4 a b f 910 e 3850654 c 56 a 4. p n g ) 这里我的解决方法是在验证器验证成功之后 , 在重新获取 file**为数组。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/399aa0717b9c490f8292a9ada126f879.png)验证器验证正常,但是`putFile`方法就会产生如下错误。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/f92bae9d022e4abf910e3850654c56a4.png)这里我的解决方法是在验证器验证成功之后,在重新获取 file为数组。![在这里插入图片描述](https://imgblog.csdnimg.cn/399aa0717b9c490f8292a9ada126f879.png)验证器验证正常,但是putFile方法就会产生如下错误。![在这里插入图片描述](https://imgblog.csdnimg.cn/f92bae9d022e4abf910e3850654c56a4.png)这里我的解决方法是在验证器验证成功之后,在重新获取file.
    Model层代码修改后如下,

    public static function uploadFile($file)
        {
            try {
                //定义上传文件大小
                $size = 2000*1024;
                //验证器检测
                validate(['image'=>"image|fileSize:$size"])->check($file);
                //重新定义$file
                $file = request()->file("image");
                //保存文件 到public配置下的avatar目录下
                $savename = \think\facade\Filesystem::disk("public")->putFile( 'avatar', $file);
    //            halt($savename);
                //定义数组信息
                $arr = ["code"=>0,'msg'=>"上传成功"];
            }catch (ValidateException $e){
                $arr = ["code"=>0,'msg'=>$e->getError()];
            }catch (\Exception $e){
                $arr = ["code"=>2,'msg'=>'系统错误'];
            }
            return $arr;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    重新上传一个符合符合要求的文件
    在这里插入图片描述反之
    在这里插入图片描述
    暂时没有想到更好的解决方法,希望各位大佬多多指点。

  • 相关阅读:
    【数据结构】顺序栈
    【老生谈算法】matlab实现PCA人脸识别算法源码——人脸识别算法
    Java学习任务总结【17】
    数据库存储引擎
    玩家们最关心的绝地求生游戏作战秘籍,分享大神干货,助您轻松提升战斗力!
    游戏声效知多少-Unity
    17 结构型模式-享元模式
    I/O
    MybatisPlus自设模板:填补原模板在controller层对CURD操作的缺乏
    ROS program for SRI force sensor
  • 原文地址:https://blog.csdn.net/qq_30817059/article/details/134017365