ThinkPHP5_上传文件

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("修改成功!"); //成功跳转
    }

猜你喜欢

转载自blog.csdn.net/weixin_42137574/article/details/105143303