zoukankan      html  css  js  c++  java
  • PHP.32-TP框架商城应用实例-后台8-商品相册-添加

    商品相册【是商品的其他相片】

    添加相册需求:

    每张图片生成三张缩略图{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 ThinkUpload(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 ThinkImage();
                        // 循环生成缩略图
                        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()进行设置

     

  • 相关阅读:
    解决跨域问题的后端解决方案
    java-反射
    验证接口实现类对于接口中所有方法是否都要重写?
    完成Triangle时遇到的问题
    刚知道的一种算法
    完成ATM编程练习题时遇到的问题
    完成Account编程练习遇到的问题
    完成StopWatch编程练习题时遇到的一些问题
    Window环境下Java备份和恢复Mysql数据
    IDEA导入项目不下载依赖问题
  • 原文地址:https://www.cnblogs.com/zixuanfy/p/6973675.html
Copyright © 2011-2022 走看看