欢迎访问艾立兹站 Aliz- 专注建站教程与技术分享
您当前的位置:首页 > 建站教程 > 帝国 CMS 教程

帝国 CMS8.0 QQ / 微信第三方登录头像下载到本地完整方案

时间:2026-06-29 19:08:01  来源:阿里站  作者:SKY  阅读:

一、需求说明


默认第三方登录只会把 QQ、微信头像远程 URL 存入数据库,图片一直调用腾讯远程地址。 目标:登录时自动把远程头像下载保存到服务器本地,数据库存储本地图片路径,不再依赖第三方外链。

二、核心函数(新增到公共函数)


打开 /e/class/connect.php,在文件末尾追加下载图片函数:
php
运行
//下载远程图片到本地
function getRemoteImage($remote_url,$save_path){
    //创建目录
    $dir=dirname($save_path);
    if(!file_exists($dir)){
        mkdir($dir,0777,true);
    }
    //获取图片内容
    $img_data=@file_get_contents($remote_url);
    if(empty($img_data)){
        return false;
    }
    file_put_contents($save_path,$img_data);
    return true;
}

三、修改第三方登录处理文件(以 QQ 登录为例,微信同理)

1、QQ 登录文件路径


/e/member/oauth/qq/login.php 找到这一行(写入会员头像的代码):
php
运行
$r[userpic]=$avatar;

替换成下面代码:
php
运行
if(!empty($avatar)){
    //生成本地文件名,唯一防重复
    $ext='jpg';
    $filename=date('Ymd').'/'.md5($avatar.time()).'.'.$ext;
    $local_file='../../../../d/file/memberavatar/'.$filename;
    //执行下载
    if(getRemoteImage($avatar,$local_file)){
        //数据库存入本地相对路径
        $r[userpic]='/d/file/memberavatar/'.$filename;
    }else{
        //下载失败保留远程地址兜底
        $r[userpic]=$avatar;
    }
}

2、微信登录文件路径


/e/member/oauth/weixin/login.php 同样找到赋值 userpic 的代码,替换为上面一模一样的代码即可。

四、目录权限设置


在网站根目录创建文件夹: /d/file/memberavatar/ 给文件夹开启 755 权限,保证 PHP 可以写入图片。

五、防止重复下载优化(可选)


只在新会员注册、头像为空的时候才下载,已存在头像不再重复抓取:
php
运行
if(!empty($avatar) && empty($r[userpic])){
    //上面的下载代码放这里
}

六、补充方案 2:使用 CURL(file_get_contents 被服务器封禁时)


把下载函数替换成 CURL 版本,兼容虚拟主机:
php
运行
function getRemoteImage($remote_url,$save_path){
    $dir=dirname($save_path);
    if(!file_exists($dir)) mkdir($dir,0777,true);
    $ch=curl_init($remote_url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
    curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
    $data=curl_exec($ch);
    curl_close($ch);
    if(!$data) return false;
    file_put_contents($save_path,$data);
    return true;
}

七、老会员批量把远程头像本地化(批量执行脚本)


新建 avatar_down.php 放到根目录,访问即可批量迁移历史头像:
php
运行
<?php
require('e/class/connect.php');
require('e/class/db.php');
$db=new mysqlquery();
$list=$db->query("select userid,userpic from phome_enewsmember where userpic like 'http%'");
while($r=$db->fetch($list)){
    $url=$r[userpic];
    $ext='jpg';
    $filename=date('Ymd').'/'.md5($url.$r[userid]).'.'.$ext;
    $savepath='d/file/memberavatar/'.$filename;
    if(getRemoteImage($url,$savepath)){
        $db->query("update phome_enewsmember set userpic='/d/file/memberavatar/$filename' where userid=$r[userid]");
        echo $r[userid]." 头像迁移成功<br>";
    }
}
echo '全部执行完毕';

八、关键注意事项

  1. 微信头像为 HTTPS 地址,服务器必须开启 SSL 与 CURL;
  2. 存储路径统一用网站相对路径,前台调用 [!userpic!] 自动正常显示;
  3. 开启防盗链后,本地图片不受腾讯域名限制,不会出现头像裂图;
  4. 帝国 CMS8.0 OAuth 第三方登录插件原版无需改动,只修改登录处理页即可。
本文为aliz.cn阿里站原创帝国 CMS 二次开发教程,转载请保留原文链接。

本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载

发表评论 共有0条评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
公众号二维码

扫码关注公众号
获取全套技术教程