前提: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就不写了。