TP6容易踩得坑【原创】

原文链接

这几天准备把网站的框架从tp5换成tp6,过程中遇到很多小坑,文件上传就是其中之一

首先tp6文件上传相对于tp5在实现过程来说区别还是比较大,所以想偷懒没成功。

如果原来的代码是类似这种方法上传,那么还是可以接着用,基本不用改。

$file = request()->file('pic');
$info = $file->move($path,'文件名');

主要是在上传验证的时候区别较大。tp5文件对象就有验证方法,而tp6统一采用的是验证器验证,所以以前类似这种写法在tp6不适用。

$file->validate(['size'=>500000,'ext'=>'jpg,png,gif'])->move($path);

下面放一段tp6官方手册的文件上传验证代码。

public function upload(){
    // 获取表单上传文件
    $files = request()->file();
    try {
        validate(['image'=>'filesize:10240|fileExt:jpg|image:200,200,jpg'])
            ->check($files);
        $savename = [];
        foreach($files as $file) {
            $savename[] = \think\facade\Filesystem::putFile( 'topic', $file);
        }
    } catch (\think\exception\ValidateException $e) {
        echo $e->getMessage();
    }}

我复制这段内容测试过没有作用,如果你也是复制过去,那么请求的结果会看到一直提示:image规则错误,最后追踪代码发现是filesize在验证器里面的验证方法名是fileSize,而且正是因为这个也导致在最终返回错误提示时本应该返回对应的错误信息但是类里面的默认规则提示数组($this->typeMsg)找不到filesize对应的值,所以直接跳到最后提示规则错误。

1611308552470384.png

所以把filesize改成fileSize就可以了。有朋友可能不习惯用try catch写法,这里放一下我自己写的。

 $file = request()->file('文件域字段名');
  $v=\validate(['文件域字段名'=>'fileSize:500000|fileExt:jpg,png,gif'])->failException(false);
  if($v->check(['文件域字段名'=>$file])){
    $name=Filesystem::putFile($path,$file);
    echo $name
  }else{
    echo $v->getError();
  }

助手函数input默认是没有任何过滤设置的,所以在使用input获取客户端传过来的数据时需要手动设置input的第三个参数(过滤数据的方法),可以在app\Request对象中设置filter全局过滤属性,app目录下Request文件,而不是在应用配置文件设置,这点跟以前的版本有区别。

namespace app;
class Request extends \think\Request{
    protected $filter = ['htmlspecialchars'];
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值