1、原理&语法
(见手册--杂项--上传,见手册--杂项--文件处理): https://www.kancloud.cn/manual/thinkphp5/155159
文件上传本身支持上传各种类型的文件,包括图片、视频、压缩包等。
比如:商城项目中商品都需要有图片展示,这些图片需要使用文件上传功能。
文件上传功能的原理:
将上传的文件保存到服务器指定位置;
将服务器上文件的访问路径保存到数据表。
①TP中的文件上传:(底层使用了\think\File类)
单文件上传
多文件上传:
上传代码实例:
验证图片:
/**
* @return 图片路径
*/
private function upload_logo()
{
//获取上传的文件
$file = request()->file('goods_logo');
//判断 是否上传了文件
if (empty($file)) {
$this->error('没有上传文件');
}
//移动图片到指定的目录下 /public/uploads/
$info = $file->validate(['size' => 100 * 1024 * 1024, 'ext' => 'jpg,png,gif,jpeg'])->move(ROOT_PATH . 'public' . DS . 'uploads');
if ($info) {
//上传成功 拼接图片的访问路径 /uploads/20190709/fssdsahfdskasa.jpg
$goods_logo = DS . 'uploads' . DS . $info->getSaveName();
//生成缩略图 \think\Image类 保存
//打开图片
$image = \think\Image::open('.' . $goods_logo);
// 生成缩略图 保存图片
$image->thumb(300, 250)->save('.' . $goods_logo);
//返回图片路径
return $goods_logo;
} else {
//上传失败
$error_msg = $file->getError();
$this->error($error_msg);
}
}
上传图片:
/**
* 保存新建的资源
*
* @param \think\Request $request
* @return \think\Response
*/
public function save(Request $request)
{
//接收传过来的数据
$data = input();
//验证规则
$rule = [
'goods_name' => 'require|max:20',
'goods_price' => 'require|number',
'goods_number' => 'require|number'
];
//验证提示信息
$msg = [
'goods_name.require' => '商品名称是必须的',
'goods_name.max' => '商品名称最长20位',
'goods_price.require' => '商品价格是必须的',
'goods_price.number' => '商品价格必须是数字',
'goods_number.number' => '商品数量必须是数字',
'goods_number.require' => '商品数量是必须的'
];
//验证的数据
$data = [
'goods_name' => $data['goods_name'],
'goods_price' => $data['goods_price'],
'goods_number' => $data['goods_number'],
];
//判断是否通过验证 并且提示信息
$validate = new Validate($rule,$msg);
if(!$validate->check($data)){
return $this->error($validate->getError());
}
//上传图片
$data['goods_logo'] = $this->upload_logo();
//插入数据
$rel = \app\admin\model\goods::create($data);
return $this->success("插入成功!");
}
修改上传图片:
修改功能中,也有logo图片上传功能
确认表单完整性,修改view/goods/edit.html, 添加name值goods_logo
在Goods控制器update方法中,调用upload_logo方法实现
需要添加一个判断:如果有图片上传,则进行图片字段的修改
/**
* 保存更新的资源
*
* @param \think\Request $request
* @param int $id
* @return \think\Response
*/
public function update(Request $request, $id)
{
//接收传过来的数据
$data = input();
//定义验证规则
$rule = [
"goods_name" => "require|max:20",
"goods_price" => "require|float|egt:0",
"goods_number" => "require|integer|egt:0"
];
//定义提示信息
$msg = [
"goods_name.require" => "商品名称不能为空",
"goods_price.require" => "商品价格不能为空",
"goods_number.require" => "商品价格不能为空"
];
//检验验证结果
$rel = $this->validate($data,$rule,$msg);
if($rel !== true){
$this->error($rel); //提示错误信息
}
//获取上传图片
$file = request()->file('goods_logo');
//检验文件是否存在
if(empty($file)){
//不存在就删除
unset($data['goods_logo']);
}else{
//存在就 用一个数组存起来
$data['goods_logo'] = $this->upload_logo();
//查询数据库
$goods = \app\admin\model\goods::find($id);
}
//修改数据库数据
$result = \app\admin\model\goods::update($data,["id" => $id],true);
if($result){ //修改成功
if(isset($goods)){
//删除数据库文件
unlink('.'.$goods->goods_logo);
}
}
return $this->success("修改成功!"); //成功跳转
}