You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP+JQuery实现头像更换功能时图片无法更新的问题

解决头像更换后仅首次刷新的问题

看起来你遇到的是浏览器缓存导致的典型问题!第一次更换后头像能正常显示,后续操作却没反应,本质是因为你的临时图片文件名大概率重复了——浏览器会缓存这个URL对应的图片,后续上传新图后URL没变化,浏览器就直接从本地缓存读取,不会去请求服务器上的新图片。

另外先提个小问题:你的HTML里<input>标签写了两个相同的id="file-upload",ID是必须唯一的,虽然这不一定是本次问题的直接原因,但建议修正,避免后续出现其他奇怪的bug。

快速修复:给URL加缓存破击参数

最简单的解决方式是在AJAX成功回调里,给返回的图片URL加上一个随机参数(比如时间戳),让浏览器认为这是全新的资源,强制加载新图片。修改你的JQuery代码如下:

$(document).ready(function() {
    $("#file-upload").change(function() {
        img($(this).closest('form'))
    });
});
function img(e) {
    let event = e[0]
    let formData = new FormData(event);
    $.ajax({
        type: 'POST',
        url: './dataProcess/UpTempImg.php',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        beforeSend: function() {
            $(".img-user-profile").attr('src', "./imagens/loading.svg")
        },
        success: function(data) {
            // 加上时间戳参数,绕过浏览器缓存
            const timestamp = new Date().getTime();
            $(".img-user-profile").attr('src', `${data}?t=${timestamp}`)
        }
    });
}

同时修正HTML里重复的ID:

<img src="./image_path/profile.png" data-toggle="tooltip" data-placement="bottom" title="Change profile image" class="border rounded-circle img-user-profile">
<input id="file-upload" type="file" name="file-upload" />

更规范的长期方案:服务器生成唯一文件名

如果想从根源解决缓存问题,建议修改UpTempImg.php的逻辑,每次上传时生成唯一的文件名(比如结合用户ID、时间戳、随机字符串),这样返回的图片URL本身就是全新的,不需要额外加参数。

给你个PHP示例参考:

// UpTempImg.php 中处理文件名的部分
$user_id = 123; // 替换成你获取当前用户ID的逻辑
$extension = pathinfo($_FILES['file-upload']['name'], PATHINFO_EXTENSION);
// 生成唯一文件名
$unique_filename = "user_{$user_id}_" . time() . "_" . uniqid() . "." . $extension;
$upload_path = "./images/temp/" . $unique_filename;

// 执行文件上传操作后,返回新的图片URL
echo "https://mysite.com.br/images/temp/" . $unique_filename;

这样每次上传的头像URL都不一样,浏览器会自动加载新图片,彻底避免缓存问题。

内容的提问来源于stack exchange,提问作者Rafael Felipe

火山引擎 最新活动