最近在写DZ的插件,要用到上传图片,刚接触不太熟悉DZ的上传类和图片类,今天摸索了半天,才终于懂点了,写了这个上传图片的函数,没有改动DZ的源文件,调用了DZ的上传和图片类。
/*
* discuz上传图片类(参数默认都为0)
* 功能:填写表单name名称自动识别多图或者单图,返回上传文件地址路径,可以生成无限自定义大小图片。
* @param mixed $file_name $_FILES的name(必填)
* @param mixed $type 例如 space (必填)
* @param mixed $maxsize 文件最大值(单位:KB,默认2048KB)
* @param mixed $urltype 返回类型(0:带路径和图片文件名,1:图片文件名)
* @param mixed $thumb 开启缩略图(0:关闭,1:开启)
* @param mixed $remove_riginal 删除原图(0:关闭,1:开启)
* @param mixed $thumblist 生成缩略图个数及配置,二维数组格式顺序为:(前缀,宽,高)array(array('thumb_','640','320'),array(),array()……))
* @param mixed $thumbtype 缩略图缩放方式(1:根据宽来缩放,2:代表居中截取)
* @return mixed 返回URL相对地址加文件名或上传图片的文件名,单图返回字符串,多图返回数组。
*
* array('author'=>'H.W.H','email'=>'five5@vip.qq.com');
*/
function upload_image($file_name,$type,$maxsize=2048,$urltype=0,$thumb=0,$remove_riginal=0,$thumblist=array(array('thumb_','640','320')),$thumbtype=0){
global $_G;
if (!$file_name) { return null; }
$basedir = $_G['setting']['attachurl'];//上传文件根目录
$subdir = date('Ym') . '/' . date('d') . '/';//子目录格式
$targetpath = $basedir .$type. '/' . $subdir;//完整目录地址
$file_mask = $_FILES[$file_name];//$_FILES的name
$fileslist = $file = $filedata = array();//数据类型初始化
$upload = new discuz_upload();//实例化上传类
if( $thumb ) { $image = new image(); }//实例化图片类
//判断是多文件还是单文件
if( count($file_mask['name'])>1 ){
$files = $_FILES[$file_name];
}else{
$files= array(
'name'=>array($file_mask['name']),
'type'=>array($file_mask['type']),
'tmp_name'=>array($file_mask['tmp_name']),
'error'=>array($file_mask['error']),
'size'=>array($file_mask['size']),
);
}
//文件合法性判断
foreach ( $files['name'] as $key => $name ) {
if (!empty($name)) {
$file = array(
'name' => $name,
'type' => $files['type'][$key],
'tmp_name' => $files['tmp_name'][$key],
'error' => $files['error'][$key],
'size' => $files['size'][$key],
);
daddslashes($file);
$upload->init($file);
if(!$upload->attach['isimage']){
cpmsg('"'.$name.'"不是图片文件','','error');
}elseif ($upload->attach['size'] > $maxsize*1024) {
cpmsg('"'.$name.'"图片不能超过'.$maxsize.'KB','','error');
}elseif (!$upload->errorcode) {
$fileslist[] = $file;//若检测文件全部合法则把数据传给下面来完成上传操作
}
}
}
//上传图片
if (!empty($fileslist) && is_array($fileslist) && is_array($thumblist)) {
foreach ($fileslist as $key=>$file) {
$upload->init($file);
if (!$upload->errorcode) {
@dmkdir($targetpath);//创建上传文件目录
$imagename[$key] = strtolower(random(16)) .'.'. $upload->get_target_extension($upload->attach['ext']);//文件名规则
$target[$key] = $targetpath . $imagename[$key];//相对地址加文件名字
$upload->save_to_local($upload->attach['tmp_name'], $target[$key]);//保存图片到指定位置
//生成缩略图
if ($thumb==1) {
foreach ($thumblist as $v) {
$thumbTarget =$type.'/'.$subdir.$v[0].$imagename[$key];
$image->Thumb($target[$key],$thumbTarget,$v[1], $v[2], $thumbtype+1);
}
}
}
$remove_riginal ? @unlink($image->source) :'';//删除原图
}
}
//返回值
if (count($fileslist)==1) {
if($urltype){ return $imagename[0]; }else{ return $target[0]; }
}else{
if($urltype){ return $imagename; }else{ return $target; }
}
}一般要配合下面这个函数使用,因为有时候想自定义调用哪个前缀的图片地址,这样就更灵活了
/*
图片返回地址自定义前缀
data/attachment/hwh_xxx/201507/09/t44wvhsvrpfjn6lo.jpg
返回data/attachment/hwh_xxx/201507/09/thumb_t44wvhsvrpfjn6lo.jpg
*/
function prePath($path,$pre='thumb_'){
$arr = explode('/',$path);
$pre = $pre.end($arr);
array_pop($arr);
array_push($arr,$pre);
$new_path = implode('/', $arr);
return $new_path;
}