thinkphp3.2.3 多图片上传 保存原图和缩略图到数据库

前提:up位于项目根目录下。目录结构如图

图片上传函数 _upPics() 放到控制器 BaseController.class.php 里,方便其他控制器继承调用
BaseController.class.php 如下

<?php
namespace Admin\Controller;
use Think\Controller;

/**
 * 基础扩展
 * @author  武当山道士
*/

class BaseController extends Controller {

    //其他代码

    /**
     * 多个图像上传 (可选是否压缩并设置压缩参数)
     * @author  武当山道士<912900700@qq.com> 2018-06-26
     * @param {string} $type        存储类型 goods:产品图, ad:广告图片, other:其他
     * @param {string} $doThumb     是否生成缩略图 
     *                                  false: 默认值 返回一维数组 ['url'=>'xxx.png', 'url'=>'yyy.png',...]
     *                                  true:  返回二维数组,[ ['url'=>'xxx.png', 'thumb'=>'xxx_thumb.jpg'],[],... ]
     * @param {array} $thumbCfg     缩略图配置数组 (默认200*200 等比压缩) 
     *                              'w':      宽, 默认200px
     *                              'h':      高, 默认200px
     *                              'method': 压缩方法(\Think\Image::IMAGE_THUMB_SCALE     =   1 ; //默认等比例缩放类型
     *                                                \Think\Image::IMAGE_THUMB_FILLED    =   2 ; //缩放后填充类型
     *                                                \Think\Image::IMAGE_THUMB_CENTER    =   3 ; //居中裁剪类型
     *                                                \Think\Image::IMAGE_THUMB_NORTHWEST =   4 ; //左上角裁剪类型
     *                                                \Think\Image::IMAGE_THUMB_SOUTHEAST =   5 ; //右下角裁剪类型
     *                                                \Think\Image::IMAGE_THUMB_FIXED     =   6 ; //固定尺寸缩放类型)
     * @return {array} $arr         图片相对根目录的web地址数组
     */
    protected function _upPics($type = 'goods', $doThumb=false, $thumbCfg=array('w'=>200,'h'=>200, 'method'=>1)){
        $config = array(
            'maxSize'    =>    2048000, //最大2M
            'rootPath'   =>    'up/'.$type.'/',
            'savePath'   =>    '',
            'saveName'   =>    array('uniqid',''),
            'exts'       =>    array('jpg','gif','png','jpeg'),
            // 'autoSub'    =>    true,
            'autoSub'    =>    false,
            'subName'    =>    array('date','Ymd'),
        );
        $baseUrl = '/up/'.$type.'/';//相对根目录路径 比如:/up/goods/
        $upload = new \Think\Upload($config);// 实例化上传类
        // 上传文件 
        $info = $upload->upload();
        $arr = array();
        $i = 0;

        if($info) {
            // 上传成功
            $image = new \Think\Image(); 
            if($doThumb){//生成缩略图
                foreach($info as $file){ //循环存储图片到服务器

                  /* 原图 图片相对根目录的web地址 */
                    $url = $baseUrl.$file['savepath'].$file['savename'];//相对根目录的路径 前面有/

                  /*生成缩略图并存在同目录,同名且加_thumb.jpg */
                    $houzhui = substr(strrchr($url, '.'), 1);
                    //取原图地址
                    $urlPath = $config['rootPath'].$file['savepath'].$file['savename'];
                    //原图文件名去掉后缀 并拼接 _thumb.jpg
                    $thumbName = preg_filter('/.'.$houzhui.'/', '_thumb.jpg', $file['savename']);
                    //缩略图 图片相对根目录的web地址
                    $thumbUrl = $baseUrl.$file['savepath'].$thumbName;//数据库存储地址
                    $image->open($urlPath)->thumb($thumbCfg['w'], $thumbCfg['h'],$thumbCfg['method'])->save('./up/'.$type.'/'.$thumbName);
                  /* 返回图片相对根目录的web地址 */
                    $arr[$i++] = array( 'url'=>$url, 'thumb'=>$thumbUrl );
                }

            }else{//不生成缩略图
                foreach($info as $file){ //循环存储图片到服务器
                    $url = $baseUrl.$file['savepath'].$file['savename'];//相对根目录的路径 前面有/
                    $arr[$i++] = array('url'=>$url);
                }
            }
            return $arr;

        }else{// 上传错误提示错误信息
            $this->error($upload->getError());
        }
    }

    //其他函数

}

其他控制器调用 _upPics()函数,例如
ItemController.class.php

<?php
namespace Admin\Controller;
use Think\Controller;
/**
 * 后台商品管理
 */
class ItemController extends BaseController {//这里继承BaseController

    //其他代码

    /* 新增商品 */
    public function add(){
        //TODO 先判断用户是否有效,是否过期 ,在BaseController里的 _initialize()里判断了

        if(IS_POST){
            $data = I('post.');
            if(empty($data)) $this->error('无上传参数');

            if(!empty($_FILES)){//生成缩略图,并设置缩略图尺寸及压缩方式
                $src = $this->_upPics( 'goods', true, array('w'=>150,'h'=>120,'method'=>1) );
                $data['thumb']=$src[0]['thumb'];
                $data['url']=$src[0]['url'];
            }

            //if(!empty($_FILES)){//或者生成缩略图,并用默认缩略图尺寸200*200
            //    $src = $this->_upPics('goods', true);
            //    $data['thumb']=$src[0]['thumb'];
            //    $data['url']=$src[0]['url'];
            //}

            //if(!empty($_FILES)){//或者不生成缩略图
            //    $src = $this->_upPics('goods');
            //    $data['url']=$src[0]['url'];
            //}

            //自动补全
            $data['created'] = data('Y-m-d H:i:s', time());
            $data['status'] = 1;
            $data['com_id'] = 1;
            $data['type'] = "1";//类型1普通,2推荐,3热销
            $data['description'] = htmlspecialchars_decode($data['description']);
            $rst = $Item->add($data);
            if($rst){
                $this->success('新增成功','',1);
            }else{
                $this->error('新增失败');
            }
        }else{
            $this->error('请求方法出错','',1);
        }
    }

    //其他代码

}

前端form就不写了。

文章来源: thinkphp3.2.3 多图片上传 保存原图和缩略图到数据库

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:thinkphp3.2.3 多图片上传 保存原图和缩略图到数据库