Discuz!强制上传头像后失败的原因分析

强制上传头像往往会作为站长防灌水和引导用户完善资料的手段,之前有部分站长提出自己的网站设置强制上传头像无效,上传头像后,依然提示需要上传。现在对这部分功能做一下分析,看看问题出在哪。

在后台,全局防灌水基本设置中,可以开启“强制新用户上传头像”,开启后,setting表中need_avatar字段的值变为“1”。这时新注册的用户如果需要进行发帖回复等操作,没进行头像上传的,应该会提示上传头像。例如进行发帖操作,会调用forum_post.php文件中的cknewuser();函数对用户进行验证,cknewuser();在function_core.php中定义,其中大约3160行有对头像的验证,我们看看验证的条件:

if($_G['setting']['need_avatar'] &&
 empty($ckuser['avatarstatus'])) {

if(empty($return)) showmessage('no_privilege_avatar', '', array(), array('return' => true));

$result
 = false;

}


首先看看setting表中是否有need_avatar值,即是否需要验证强制上传头像,并且验证用户member表中的avatarstatus字段是否有值,即这个用户是否上传过头像,上传过值为1,否,则值为0,从这里看,如过设置过需要进行强制上传头像,那么,setting表中need_avatar字段值应该是有的,如果还提示需要上传,则说明member表中的头像状态值为0,下面我们看看这个状态值怎么来的。

我们从上传头像开始,上传头像需要的文件为spacecp_avatar.php,

if(empty($space['avatarstatus']) &&
 uc_check_avatar($_G['uid'], 'middle')) {

DB::update('common_member',
 array('avatarstatus'=>'1'), array('uid'=>$_G['uid']));

updatecreditbyaction('setavatar');

manyoulog('user',
 $_G['uid'], 'update');

}

我们只对部分代码进行分析,这段代码的作用是,上传了头像后,判断这个用户是否上传过头像,即有没有avatarstatus值,并且用uc_check_avatar检查用户头像是否存在,这个uc_check_avatar函数用到了uc_fopen2函数,uc_fopen2函数用到几个参数,其中就有UCenter的配置文件中的Ip,host,如果用户对其hosts文件进行过修改,或留空且域名解析有问题,都会造成uc_fopen2函数返回值不为1,不为1的情况下,造成上一段代码条件不成立,进而没有对common_member表的avatarstatus值进行update更新操作,那么也就造成一直提示用户需要上传头像。

解决方法:一个是可以填写服务器真实IP,或者参照网上其它方法,例如

找到

function uc_check_avatar($uid, $size =
 ‘middle’, $type = ‘virtual’) {

$url =
 UC_API.”/avatar.php?uid=$uid&size=$size&type=$type&check_file_exists=1″;

$res = uc_fopen2($url, 500000, ”, ”, TRUE, UC_IP, 20);

if($res == 1) {

return 1;

} else {

return 0;

}

}

改成:

function uc_check_avatar($uid, $size =
 ‘middle’, $type = ‘virtual’) {

$url =
 UC_API.”/avatar.php?uid=$uid&size=$size&type=$type&check_file_exists=1″;

@$file_exists = trim(uc_fopen2(UC_API.”/avatar.php?uid=$uid&check_file_exists=1″));

return $file_exists;

}

直接进行头像文件存在与否的判断。

Comments

No comments yet. Why don’t you start the discussion?

发表回复