[thinkPHP5项目实战_13]新增文章界面附件上传

来源:互联网 发布:一键锁屏软件 编辑:程序博客网 时间:2024/05/01 00:12

1.新增文章验证器和控制器

根据[thinkPHP5入门实战_09]后台添加栏目及验证介绍新增栏目的方式构建新增文章的操作方法


构建验证器validate/Article.php:

<?phpnamespace app\admin\validate;use think\Validate;class Article extends Validate{    //验证规则    protected $rule = [        //必须,长度不能超过25,名称不能重复        'title'  =>  'require|max:25|unique:article',    ];    //验证提示    protected $message  =   [        'title.unique' => '文章名称不能重复',         'title.max' => '文章名称不能大于25个字符',        'title.require' => '文章名称必须',    ];}
控制器方法controller/Article.php:

<?phpnamespace app\admin\controller;use think\Controller;class Article extends Controller{    public function lists()    {        return $this->fetch();    }    public function add()    {    //reuqest方法继承于Controller,使用request助手函数判断请求方式        //使用助手函数input接收接收输入的值    if(request()->isPost()){    $data = [    'title' => input('title'),    'keywords' => input('keywords'),    'desc' => input('desc'),    'content' => input('content'),    'time' => time(),    ];    //对输入的内容进行验证,使用tp5推荐的验证器的方式    $validate = \think\Loader::validate('Article');    if($validate->check($data)){    var_dump($data);//如果验证没问题就输出信息    }else{                //验证失败输出提示信息                return $this->error($validate->getError());            }    return;    }        return $this->fetch();    }}


2.文件上传

thinkPHP5提供了文件上传的方法:

ThinkPHP5.0对文件上传的支持更加简单。内置的上传只是上传到本地服务器,上传到远程或者第三方平台的话需要自己扩展。假设表单代码如下:<form action="/index/index/upload" enctype="multipart/form-data" method="post"><input type="file" name="image" /> <br> <input type="submit" value="上传" /> </form> 然后在控制器中添加如下的代码:public function upload(){    // 获取表单上传文件 例如上传了001.jpg    $file = request()->file('image');        // 移动到框架应用根目录/public/uploads/ 目录下    $info = $file->move(ROOT_PATH . 'public' . DS . 'uploads');    if($info){        // 成功上传后 获取上传信息        // 输出 jpg        echo $info->getExtension();        // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg        echo $info->getSaveName();        // 输出 42a79759f284b767dfcb2a0197904287.jpg        echo $info->getFilename();     }else{        // 上传失败获取错误信息        echo $file->getError();    }}move方法成功的话返回的是一个\think\File对象,你可以对上传后的文件进行后续操作。

在本项目中,用户可以选择是否上传文件,因此在需要在操作方法中进行一个判断是否有文件上传,

上传后的文件需要保存在/public/static/uploads目录下,因此需要修改路径为/static/uploads,

$data['pic']需要将文件在本地的位置存储到数据库中,因此需要使用字符串拼接出文件位置,

最后将$data存入数据库。

最终代码为:

<?phpnamespace app\admin\controller;use think\Controller;class Article extends Controller{    public function lists()    {        return $this->fetch();    }    public function add()    {    //reuqest方法继承于Controller,使用request助手函数判断请求方式        //使用助手函数input接收接收输入的值    if(request()->isPost()){    $data = [    'title' => input('title'),    'keywords' => input('keywords'),    'desc' => input('desc'),    'content' => input('content'),    'time' => time(),    ];    //判断表单是否上传了文件    if($_FILES['pic']['tmp_name']){    //获取表单上传的文件    $file = request()->file('pic');    // 移动到框架应用根目录/public/uploads/ 目录下    $info = $file->move(ROOT_PATH . 'public' . DS . '/static/uploads');    if($info){        //拼接文件路径        //使用date()方法计算出八位时间,上传到uploads的文件所在的文件名就是这八位时间        //使用$info->getFilename()方法获取文件名        $data['pic'] = '/static/uploads/'.date('Ymd').'/'.$info->getFilename();    }else{        // 上传失败返回错误信息        return $this->error($file->getError());    }    };    //对输入的内容进行验证,使用tp5推荐的验证器的方式    $validate = \think\Loader::validate('Article');    if($validate->check($data)){    //文件上传完毕,表单验证完毕,存入数据库    $res = \think\Db::name('article')->insert($data);                //添加判断,成功则跳转到lists方法                if($res){                    return $this->success('增加文章成功');                }else{                    return $this->error('增加文章失败');                }    }else{                //验证失败输出提示信息                return $this->error($validate->getError());            }    return;    }        return $this->fetch();    }}

3.效果: