项目中图片的两个优化【扩展和维护方式】
- 图片的相关配置写配置文件中
- 图片的路径不要在项目中写错,也写到配置文件中
- 把上传图片和生成缩略图的代码封装成一个函数,这样项目中再上传图片直接调函数即可
<?php
return array(
'DB_TYPE' => 'pdo', // mysql,mysqli,pdo
'DB_DSN' => 'mysql:host=localhost;dbname=php40;charset=utf8',
'DB_USER' => 'root', // 用户名
'DB_PWD' => '123', // 密码
'DB_PORT' => '3306', // 端口
'DB_PREFIX' => 'p40_', // 数据库表前缀
//'DB_HOST' => 'localhost', // 服务器地址
//'DB_NAME' => 'php39', // 数据库名
//'DB_CHARSET' => 'utf8', // 数据库编码默认采用utf8
'DEFAULT_FILTER' => 'trim,htmlspecialchars',
/**********图片相关的配置*******/
'IMAGE_CONFIG'=>array(
'maxSize'=>'1024*1024',
'exts'=>array('jpg','gif','png','jpeg'),
'rootPath'=>'./Public/Uploads/', //上传图片的保存路径
'ViewPath'=>'/Public/Uploads/', //显示图片的路径
)
);
function showImage($url, $width = '', $height = '')
{
$ic = C('IMAGE_CONFIG');
if($width)
$width = "width='$width'";
if($height)
$height = "height='$height'";
echo "<img $width $height src='{$ic['viewPath']}$url' />";
}
<td align="center"><?php showImage($v['sm_logo']) ; ?></td>
总结:目的,如果有一天路径变了,只需要修改配置文件的viewPath即可,代码不用动。
- 再封装一个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'];
// 判断是否生成缩略图
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;
}
}
}
----------------------------------------------------------
protected function _before_insert(&$data, $option)
{
/**************** 处理LOGO *******************/
// 判断有没有选择图片
if($_FILES['logo']['error'] == 0)
{
$ret=uploadOne('logo','Goods',array(
array(700,700),
array(350,350),
array(130,130),
array(50,50),
));
$data['logo']=$ret['images'][0];
$data['mbig_logo']=$ret['images'][1];
$data['big_logo']=$ret['images'][2];
$data['mid_logo']=$ret['images'][3];
$data['sm_logo']=$ret['images'][4];
}
}
// 获取当前时间并添加到表单中这样就会插入到数据库中
$data['addtime'] = date('Y-m-d H:i:s', time());
// 我们自己来过滤这个字段
$data['goods_desc'] = removeXSS($_POST['goods_desc']);
}
总结:图片做了四处修改:
- 配置放到配置文件中
- 封装了删除函数【从配置文件中读出目录然后删除】
- 封装了显示图片的函数【路径是从配置文件中读的】
- 封装了一个上传图片的函数
以后我们项目中所有图片的操作都使用这三个函数。。