最近在写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; }