解决Ucenter 头像上传小收获

  由于中心用的是康盛的Ucenter作为用户存储,现在想搞统一登录,

  用户基本信息统一存储,然后存到memcatch中,那个子站点需要用户数据从memcatch中直接读取,在用户中心建设中头像上传搞的一直出现  Invalid identity! ,看了返回值-1,

  在Ucenter源码中user.php 下的onuploadavatar function下 

    $uid = $this->input('uid'); 当uid为空的时候出现报错-1 

  每个程序都有自己的写法,看到 $this->input 应该是$this->init_input(getgpc('agent', 'G'));通过这个初始化得到的,去init_input中看了一下,只有解密没有说具体有哪些量,getgpc是他自己定义的函数

 1 function getgpc($k, $type='GP') {
 2         $type = strtoupper($type);
 3         switch($type) {
 4                 case 'G': $var = &$_GET; break;
 5                 case 'P': $var = &$_POST; break;
 6                 case 'C': $var = &$_COOKIE; break;
 7                 default:
 8                         if(isset($_GET[$k])) {
 9                                 $var = &$_GET;
10                         } else {
11                                 $var = &$_POST;
12                         }
13                         break;
14         }
15         return isset($var[$k]) ? $var[$k] : NULL; 
16 }

也就是本地传过去的agent数据有错,

  这段是上传头像的组件生成

function uc_avatar($uid, $type = 'virtual', $returnhtml = 1) {
    $uid = intval($uid);
    $uc_input = uc_api_input("uid=$uid");
    $uc_avatarflash = UC_API.'/images/camera.swf?inajax=1&appid='.UC_APPID.'&input='.$uc_input.'&agent='.md5($_SERVER['HTTP_USER_AGENT']).'&ucapi='.urlencode(UC_API).'&avatartype='.$type;
    if($returnhtml) {
        return '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="447" height="477" id="mycamera" align="middle">
            <param name="allowScriptAccess" value="always" />
            <param name="scale" value="exactfit" />
            <param name="wmode" value="transparent" />
            <param name="quality" value="high" />
            <param name="bgcolor" value="#ffffff" />
            <param name="movie" value="'.$uc_avatarflash.'" />
            <param name="menu" value="false" />
            <embed src="'.$uc_avatarflash.'" quality="high" bgcolor="#ffffff" width="447" height="477" name="mycamera" align="middle" allowScriptAccess="always" allowFullScreen="false" scale="exactfit"  wmode="transparent" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
        </object>';
    } else {
        return array(
            'width', '447',
            'height', '477',
            'scale', 'exactfit',
            'src', $uc_avatarflash,
            'id', 'mycamera',
            'name', 'mycamera',
            'quality','high',
            'bgcolor','#ffffff',
            'wmode','transparent',
            'menu', 'false',
            'swLiveConnect', 'true',
            'allowScriptAccess', 'always'
        );
    }
}

   最后发现是引用uc_avatar的时候uid变量写错了,因为是之前用过这个组件也是一直出错,也没去查原理和原因,这次想查个透彻,以后用的时候就方便了,以后写头像上传也可以借用一下这个swf,还是蛮好用的。有时间了把这个swf提出来,自己搞一个头像上传,现在还是写自己的用户中心吧,当然力气没白费还是学了不少东西的,比如

    getgpc来获取传过来的数据,get_home 和 set_home将头像分别存储到不同文件夹

    function set_home($uid, $dir = '.') {
        $uid = sprintf("%09d", $uid);
        $dir1 = substr($uid, 0, 3);
        $dir2 = substr($uid, 3, 2);
        $dir3 = substr($uid, 5, 2);
        !is_dir($dir.'/'.$dir1) && mkdir($dir.'/'.$dir1, 0777);
        !is_dir($dir.'/'.$dir1.'/'.$dir2) && mkdir($dir.'/'.$dir1.'/'.$dir2, 0777);
        !is_dir($dir.'/'.$dir1.'/'.$dir2.'/'.$dir3) && mkdir($dir.'/'.$dir1.'/'.$dir2.'/'.$dir3, 0777);
    }

    function get_home($uid) {
        $uid = sprintf("%09d", $uid);
        $dir1 = substr($uid, 0, 3);
        $dir2 = substr($uid, 3, 2);
        $dir3 = substr($uid, 5, 2);
        return $dir1.'/'.$dir2.'/'.$dir3;
    }

  上传的时候上传的量有

   inajax     
        appid      
        input        
        agent       
        ucapi       
        avatartype  

  agent用来校验数据来源,uid用来通知要修改的头像是哪个用户的头像,

原文地址:https://www.cnblogs.com/happig/p/3131607.html