这个图片上传及生成缩略图是和前面学习的数据添加在一块的,前面备案没机会做笔记,正巧都是一个方法里的东西,可以一并记录下了。
话说生成缩略图,真心搞懵逼了,现在虽然效果实现了,但代码还是觉得非常奇怪,也请大神看到指点一二。
导致这个方法代码感觉非常多,绕山绕水的,年纪大,生怕忘记了什么方法,所以备注也是非常多。
//商品增加
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添加数据就可以了。