精华原创discuz插件制作,图片上传函数

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


本文地址:http://wuheng.net/blog_71.html 转载请注明出处

分享到: