这个图片上传及生成缩略图是和前面学习的数据添加在一块的,前面备案没机会做笔记,正巧都是一个方法里的东西,可以一并记录下了。

话说生成缩略图,真心搞懵逼了,现在虽然效果实现了,但代码还是觉得非常奇怪,也请大神看到指点一二。

导致这个方法代码感觉非常多,绕山绕水的,年纪大,生怕忘记了什么方法,所以备注也是非常多。

//商品增加
public function add() {
    $goods = M('goods'); //实例化数据库
    if (!empty($_POST)) {
        if (!empty($_FILES)) {
            $config = array(
                'rootPath' => './public/', //文件上传保存的根路径
                'savePath' => 'upload/', //文件上传的保存路径(相对于根路径)
            );
            $upload = new \Think\Upload($config); // 实例化上传类
            $info = $upload->uploadOne($_FILES['goods_img']); //uploadOne是上传单个文件的方法
            if (!$info) { //判断文件是否上传成功
                $this->error($upload->getError()); //没有成功显示上传失败的信息,$upload->getError()显示上传失败信息的方法
            } else {
                //拼装文件路径/文件名
                $imginfo = $info['rootPath'] . $info['savepath'] . $info['savename']; // 上传成功 获取上传文件信息,拼接好的图片可以用这个格式,模板里面用__PUBLIC__带文件路径即可。
                $_POST['goods_big_img'] = $imginfo; //POST的是goods_big_img数据表名,否则create()收集不到数据
                //制作缩略图
                $image = new \Think\Image(); //实例化类库
                $srcimg = $upload->rootPath . $imginfo; //因为__PUBLIC__常量不能在控制器使用,可以换为用upload()方法调用rootPath生成,$upload->rootPath = __PUBLIC__。
                $image->open($srcimg); //打开图片文件
                $smallinfo = $upload->rootPath . $info['rootPath'] . $info['savepath'] . "small_" . $info['savename']; //同理,拼装小图存储的位置和文件名
                $image->thumb(150, 150)->save($smallinfo); //按照原图的比例生成一个最大为150*150的缩略图,并存到指定的路径
                $smallimg = $info['rootPath'] . $info['savepath'] . "small_" . $info['savename']; //因为上面是缩略图存入路径,所以要相对的路径,而存入数据库不能带__PUBLIC__地址,所以在获得POST数据的时候在把 $upload->rootPath路径去掉。
                $_POST['goods_small_img'] = $smallimg; //让数据获取到小图信息,并存到数据库
            }
        }
        $goods->create(); //收集post表单数据
        $str = $goods->add(); //添加数据
        if ($str) {
            $this->success('商品添加成功!', U('showlist'));
        } else {
            $this - error('商品添加失败!', U('add'));
        }
    } else {
        $this->display(); //没有POST显示空模板
    }
}

首先是添加数据,收集表单的create()方法。
模板有POST的自然能收集到,但对于上传的图片,特别是缩略图,是表单里没提交的,所以在控制器里面做了两个POST,否则这两个图片是无法写到数据库里面的。

图片的上传没什么大问题,而且3.2.3里面的__PUBLIC__还是解决了好多问题的。

但在缩略图上,__PUBLIC__只能在模板里面用,在控制器里面,这个东东要么做配置文件,要么无解。但还好视频里老师必然也是遇到这个问题,所以用了$upload->rootPath这个方法来实现,因为rootPath这个路径,是在upload()方法里面设置过的。

但是懵逼的问题是

$smallinfo = $upload->rootPath . $info['rootPath'] . $info['savepath'] . "small_" . $info['savename'];

虽然是做达到了正确的存储路径和文件名,但是这样子ADD到数据库里,在读取的时候路径又有问题了,这个路径大概是这样的
./public/upload/2016-01-20/small_569face5c9944.jpg
虽然是有了./public/目录,可以把模板里的__PUBLIC__去掉输出,但也不行,路径这样就少了项目名称。
好吧,说去了$upload->rootPath这个吧,但存小图的时候,又没有/public/了,路径又NND不对了。

所以作为菜鸟的我,在写一个变量用给POST存数据。

$smallimg = $info['rootPath'] . $info['savepath'] . "small_" . $info['savename'];

好吧,不管怎么说,这样子做倒是解决了问题了,但是代码上就觉得非常奇怪了。

数据添加到是比较简单。

$goods->create(); //收集post表单数据
$str = $goods->add(); //添加数据

实例化数据库后,create收集数据,在add添加数据就可以了。

最后修改:2016 年 09 月 29 日
如果觉得我的文章对你有用,请随意赞赏