由于中心用的是康盛的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用来通知要修改的头像是哪个用户的头像,