欢迎您访问我的笔记本站旨在于记录一些平时工作中遇到的一些问题和解决方法,方便查阅,部分内容来源于网络,如有侵权请联系我删除
  • 微信微信
您现在的位置是:首页 > PHP后端

TP6容易踩得坑-[原创]

日期:2021-01-22 17:45:26 作者:tanyi 来源:我的笔记 浏览:556 次
这几天准备把网站的框架从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'];
}



原创文章转载时请注明原始出处,作者等相关信息

提交评论
评论列表