[thinkPHP5项目实战_13]新增文章界面附件上传
文章 1817 0 0 0
发布时间:2019年12月28日

概述

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

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

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

构建验证器validate/Article.php

<?php
namespace 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

<?php
namespace 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存入数据库。

最终代码为:

<?php
namespace 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.效果:

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

评论专区
Q群
Q群
Q群
反馈
纠错