商品相册【是商品的其他相片】
添加相册需求:
每张图片生成三张缩略图{50*50、350*350、650*650}
1、建表p39_goods_pic{id,pic,sm_pic,mid_pic,big_pic,goods_id
drop table if exists p39_goods_pic; create table p39_goods_pic( id mediumint unsigned not null auto_increment comment ‘Id‘, pic varchar(150) not null default ‘‘ comment ‘原图‘, sm_pic varchar(150) not null default ‘‘ comment ‘小图‘, mid_pic varchar(150) not null default ‘‘ comment ‘中图‘, big_pic varchar(150) not null default ‘‘ comment ‘大图‘, goods_id mediumint unsigned not null comment ‘商品Id‘, primary key(id), key goods_id(goods_id) )engine=InnoDB default charset=utf8 comment ‘商品相册‘;
p39_goods_pic
2、在添加表单的商品相册处制作一个“添加一张”的按钮,通过JS实现点击一次增加一个文本域
//添加一张 $("#btn_add_pic").click(function(){ var file = ‘<li><input type="file" name="pic[]" /></li>‘; $("#ul_pic_list").append(file);
JS demo
3、在商品模型GoodsModel.class.php/_after_inser()中添加处理商品相册的代码
思路:
1.利用已经封装好的函数uploadOne(名称,存放目录,[缩略图尺寸数组]),上传一张图片
function uploadOne($imgName, $dirName, $thumb = array()) { // 上传LOGO if(isset($_FILES[$imgName]) && $_FILES[$imgName][‘error‘] == 0) { $ic = C(‘IMAGE_CONFIG‘); $upload = new \Think\Upload(array( ‘rootPath‘ => $ic[‘rootPath‘], ‘maxSize‘ => $ic[‘maxSize‘], ‘exts‘ => $ic[‘exts‘], ));// 实例化上传类 $upload->savePath = $dirName . ‘/‘; // 图片二级目录的名称 // 上传文件 // 上传时指定一个要上传的图片的名称,否则会把表单中所有的图片都处理,之后再想其他图片时就再找不到图片了 $info = $upload->upload(array($imgName=>$_FILES[$imgName])); if(!$info) { return array( ‘ok‘ => 0, ‘error‘ => $upload->getError(), ); } else { $ret[‘ok‘] = 1; $ret[‘images‘][0] = $logoName = $info[$imgName][‘savepath‘] . $info[$imgName][‘savename‘]; // 判断是否生成缩略图[$thumb数组存储尺寸] if($thumb) { $image = new \Think\Image(); // 循环生成缩略图 foreach ($thumb as $k => $v) { $ret[‘images‘][$k+1] = $info[$imgName][‘savepath‘] . ‘thumb_‘.$k.‘_‘ .$info[$imgName][‘savename‘]; // 打开要处理的图片 $image->open($ic[‘rootPath‘].$logoName); $image->thumb($v[0], $v[1])->save($ic[‘rootPath‘].$ret[‘images‘][$k+1]); } } return $ret; } } }
uploadOne()
2、循环每张图片调用uploadOne一个一个处理,处理完插入到相册表中
先观察文件数据的结构,如下:
两种文件,一是商品logo{logo};而是商品相册pic{pic},一维数组logo;二维数组pic
因为商品图片pic是二维数组,而uploaOne只能处理一维数组,类似logo那样的数组结构,因此要转换为一维数组$pics[]
再进行图片处理
//钩子方法_after_insert:添加操作成功后执行 protected function _after_insert($data, $option) { /**********商品相册处理********/ $pics = array(); //var_dump($_FILES[‘pic‘][‘name‘]);die(); //二维数组转成一维 foreach ($_FILES[‘pic‘][‘name‘] as $k => $v) { $pics[] = array( ‘name‘ => $v, ‘type‘ => $_FILES[‘pic‘][‘type‘][$k], ‘tmp_name‘ => $_FILES[‘pic‘][‘tmp_name‘][$k], ‘error‘ => $_FILES[‘pic‘][‘error‘][$k], ‘size‘ => $_FILES[‘pic‘][‘size‘][$k], ); } //var_dump($pics);die(); $_FILES = $pics; //把处理好的数组赋给$_FILES,因为uploadOne函数是在$_FILES中获取图片的 $gpModel = M(‘goods_pic‘); //循环每个上传 foreach ($pics as $k => $v) { if($v[‘error‘] == 0) { $ret = uploadOne($k, ‘Goods‘, array( array(650, 650), array(350, 350), array(50, 50), )); //var_dump($ret);die(); if($ret[‘ok‘] == 1) { $gpModel->add(array( ‘pic‘ => $ret[‘images‘][0], ‘big_pic‘ => $ret[‘images‘][1], ‘mid_pic‘ => $ret[‘images‘][2], ‘sm_pic‘ => $ret[‘images‘][3], ‘goods_id‘ => $data[‘id‘], )); } } } /**********会员价格处理********/ $mp = I(‘post.member_price‘); //接收post提交过来的会员价格数据 $mpModel = D(‘member_price‘); foreach ($mp as $k => $v) { $_v = (float)$v; //强制转为浮点型,以免插入字符等错误数据 //设置会员价格>0就插入到表中 if($_v > 0) { $mpModel->add(array( ‘price‘ => $_v, ‘level_id‘ => $k, //级别Id ‘goods_id‘ => $data[‘id‘], )); } } }
_after_insert
注意:批量上传时,uploaOne是处理不了二维数组的,必须转成一维数组,再用foreach循环插入数据库
问题:
1、上传的图片数量在表单看来是没有限制的,倒是在php.ini中限制了post_max_size,所以在商品添加表单还需做点优化,限制用户上传图片的尺寸和数量
2、PHP脚本默认的执行时间是30秒,可能会导致数据处理不完。可根据需求,在表单数据处理前使用set_time_limit()进行设置
时间: 2024-10-27 11:33:47