您的位置:首页 > 编程语言 > PHP开发

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

2017-08-31 18:05 489 查看

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

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



构建验证器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.效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: