修复微信小程序获取头像的bug,微信小程序新版头像API使用

这篇具有很好参考价值的文章主要介绍了修复微信小程序获取头像的bug,微信小程序新版头像API使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

接着我之前发布的一篇文章:微信小程序上传头像的临时路径,持久化保存到服务器与数据库(nodejs后台开发)_盒子猫君的博客-CSDN博客

今天我就来解决掉之前的问题吧!

修复微信小程序获取头像的bug,微信小程序新版头像API使用,微信小程序,bug,小程序

从之前的后台报错来看,获取到的tempFilePath值和avatarUrl的值相同,都是http://tmp,不过头像都已经上传成功了并存到了数据库。而在真机调试时,用户选择头像后,是无法保存到数据库和对应的文件夹中的。

经过分析后,原因是在微信小程序中,选择头像后会返回一个临时文件路径(tempFilePath)供开发者进行上传和保存操作。真机调试时,是无法直接访问和保存这个临时文件的,所以在该代码中直接读取tempFilePath可能会出现问题。

解决方案下面就有了:

使用wx.saveFile保存临时文件,并将保存的文件路径作为参数传递给wx.uploadFile进行上传操作:

onChooseAvatar(e) {
    const { avatarUrl } = e.detail

    wx.saveFile({
        tempFilePath: avatarUrl,
        success(res) {
            const savedFilePath = res.savedFilePath
            console.log("保存的头像文件路径:" + savedFilePath)

            // 上传保存的图片
            wx.uploadFile({
                url: config.apiUrl + '/api/avatarUrl',
                filePath: savedFilePath,
                name: 'file',
                formData: {
                    'openid': wx.getStorageSync('openid')
                },
                success(res) {
                    console.log('uploadFile响应数据:', res.data);
                    try {
                        const data = JSON.parse(res.data)
                        console.log('upload success');
                        console.log("成功获取到用户头像存入数据库:", data.path);
                        wx.showToast({
                            title: '头像上传成功',
                            icon: 'success',
                        });
                    } catch(e) {
                        console.log('返回数据不是json格式,无法解析');
                        wx.showToast({
                            title: '头像上传失败',
                            icon: 'error'
                        });
                    }
                },
                fail(res) {
                    console.log('upload fail');
                }
            })
        },
        fail(res) {
            console.log('saveFile fail');
        }
    })
},

在后台路由代码中,利用Node.js的文件流将临时文件保存到指定目录,然后使用保存后的文件路径进行数据库操作:

const express = require('express');
const router = express.Router();
const sql = require('../sql');
const multer = require('multer');
const fs = require('fs');

// 设置文件上传的目录
const storage = multer.diskStorage({
    destination: function(req, file, cb) {
        cb(null, './public/upload')
    },
    filename: function(req, file, cb) {
        cb(null, Date.now() + '-' + file.originalname)
    }
})

const upload = multer({ storage: storage })

router.post('/avatarUrl', upload.single('file'), (req, res) => {
    console.log('Received file:', req.file);
    console.log('Received body:', req.body);

    const openid = req.body.openid;
    const tempFilePath = req.file.path;
    const avatarUrl = 'https://like.likehistory.top/upload/' + req.file.filename;

    // 将临时文件保存到指定目录
    const savedFilePath = './public/saved/' + req.file.filename;
    const readStream = fs.createReadStream(tempFilePath);
    const writeStream = fs.createWriteStream(savedFilePath);
    readStream.pipe(writeStream);

    // 创建MySQL查询
    const sqlStr = 'SELECT * FROM wxusers WHERE openid = ?';

    // 查询数据库
    sql.query(sqlStr, [openid], function(err, result) {
        if (err) {
            console.error(err);
            res.status(500).send('Database error');
        } else {
            // 检查是否有匹配的openId
            if (result.length > 0) {
                const sqlStr = `UPDATE wxusers SET avatarUrl = '${avatarUrl}' WHERE openid = '${openid}'`;
                sql.query(sqlStr, (err, result) => {
                    if (err) throw err;
                    res.json({ path: avatarUrl });
                });
                console.log("更新新路径", avatarUrl);
            } else {
                const sqlStr = `INSERT INTO wxusers (openid, avatarUrl) VALUES ('${openid}','${avatarUrl}')`;
                sql.query(sqlStr, [openid, avatarUrl], (err, result) => {
                    if (err) throw err;
                    res.json({ path: avatarUrl });
                });
                console.log("插入新路径", avatarUrl);
            }
        }
    });
});

module.exports = router;

这下终于调式成功了,不过后台告诉我:wx.saveFile 即将废弃,请使用 wx.getFileSystemManager().saveFile。所以下面再修改一下微信小程序的代码:

onChooseAvatar(e) {
    const { avatarUrl } = e.detail

    wx.getFileSystemManager().saveFile({
        tempFilePath: avatarUrl,
        success(res) {
            const savedFilePath = res.savedFilePath
            console.log("保存的头像文件路径:" + savedFilePath)

            // 上传保存的图片
            wx.uploadFile({
                url: config.apiUrl + '/api/avatarUrl',
                filePath: savedFilePath,
                name: 'file',
                formData: {
                    'openid': wx.getStorageSync('openid')
                },
                success(res) {
                    console.log('uploadFile响应数据:', res.data);
                    try {
                        const data = JSON.parse(res.data)
                        console.log('upload success');
                        console.log("成功获取到用户头像存入数据库:", data.path);
                        wx.showToast({
                            title: '头像上传成功',
                            icon: 'success',
                        });
                    } catch(e) {
                        console.log('返回数据不是json格式,无法解析');
                        wx.showToast({
                            title: '头像上传失败',
                            icon: 'error'
                        });
                    }
                },
                fail(res) {
                    console.log('upload fail');
                }
            })
        },
        fail(res) {
            console.log('saveFile fail');
        }
    })
},

最后还要在小程序的`app.json`文件中的`permission`字段中添加相关的权限配置:

"permission": {
    "scope.writePhotosAlbum": {
      "desc": "保存图片到相册"
    },
    "scope.camera": {
      "desc": "拍照功能"
    },
    "scope.userLocation": {
      "desc": "获取用户地理位置"
    }
    // 添加其他需要的权限配置
  },

当然了,我在运行上面的代码后,还是发现了另一个问题。在用户选择相册中的图片作为头像时,由于图片是异步加载的,可能会导致上传成功后头像没有立即刷新显示。为了解决这个问题,可以在上传成功后,手动更新头像的URL,至于强制刷新页面,可有可无。

onChooseAvatar(e) {
    const { avatarUrl } = e.detail;

    wx.getFileSystemManager().saveFile({
        tempFilePath: avatarUrl,
        success(res) {
            const savedFilePath = res.savedFilePath;
            console.log("保存的头像文件路径:" + savedFilePath);

            // 上传保存的图片
            wx.uploadFile({
                url: config.apiUrl + '/api/avatarUrl',
                filePath: savedFilePath,
                name: 'file',
                formData: {
                    'openid': wx.getStorageSync('openid')
                },
                success(res) {
                    console.log('uploadFile响应数据:', res.data);
                    try {
                        const data = JSON.parse(res.data);
                        console.log('upload success');
                        console.log("成功获取到用户头像存入数据库:", data.path);
                        
                        // 更新头像URL
                        this.setData({
                            avatarUrl: data.path
                        });

                        // 强制刷新页面
                        wx.reLaunch({
                            url: '/pages/index/index' // 替换成你的页面路径
                        });

                        wx.showToast({
                            title: '头像上传成功',
                            icon: 'success',
                        });
                    } catch(e) {
                        console.log('返回数据不是json格式,无法解析');
                        wx.showToast({
                            title: '头像上传失败',
                            icon: 'error'
                        });
                    }
                },
                fail(res) {
                    console.log('upload fail');
                }
            });
        },
        fail(res) {
            console.log('saveFile fail');
        }
    });
},

这篇文章就完美解决了用户上传头像的问题。大家可以参考!文章来源地址https://www.toymoban.com/news/detail-732331.html

到了这里,关于修复微信小程序获取头像的bug,微信小程序新版头像API使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序新版头像昵称上传

    官方文档:小程序用户头像昵称获取规则调整公告 | 微信开放社区 头像昵称填写 | 微信开放文档 为我们小程序写了一个头像昵称上传的组件总结了下 需要注意的点: 我们后端服务器存的老用户的头像昵称有的是:之前早版本( wx.getUserInfo )能获取到的用户真实微信头像昵

    2024年02月11日
    浏览(55)
  • 最新微信小程序获取头像昵称,直接用,uniapp获取微信小程序头像昵称

    微信小程序获取用户头像和昵称一个开放接口是wx.getUserInfo,2021年4月5日被废弃,原因是很多开发者在打开小程序时就通过组件方式唤起getUserInfo弹窗,如果用户点击拒绝,无法使用小程序,这种做法打断了用户正常使用小程序的流程,同时也不利于小程序获取新用户,后面新

    2024年02月11日
    浏览(54)
  • 最新版微信小程序授权登录(自定义头像昵称)

            根据官方微信小程序开发关于登录授权API的调整,自 2022年10月25日起有关API接口获取用户头像将统一返回默认灰色头像,昵称将统一返回 “微信用户”。(如下图所示) ​ ​ ​ ​ button标签中将open-type=\\\"chooseAvatar\\\"是用来设置用户头像,并且获得一个临时路径。 js代

    2024年02月12日
    浏览(51)
  • 微信小程序获取头像

    当小程序需要让用户完善个人资料时,可以通过微信提供的头像昵称填写能力快速完善。 根据相关法律法规,为确保信息安全,由用户上传的图片、昵称等信息微信侧将进行安全检测,组件从基础库2.24.4版本起,已接入内容安全服务端接口(mediaCheckAsync、msgSecCheck),以减少

    2024年02月16日
    浏览(44)
  • 微信小程序获取昵称,头像

    1,昵称:使用到的是微信小程序文档里的api input框的type值设置为nickname,再使用双向绑定的方法拿到值 这个方法点击input框的时候它会弹出你当前的微信名称,基础库版本较低的话电脑上无法显示,只能在真机调试上显示 2,头像 点击按钮底部弹出自己的头像,也可以上传新

    2024年02月12日
    浏览(53)
  • 微信小程序-获取用户头像信息以及修改用户头像

    这里主要用到 button的open-type 功能,官网已有说明: 给 button 设置 open-type=\\\"chooseAvatar\\\" ,来使 bindchooseavatar 方法生效,在 bindchooseavatar 指定的函数中获取用户的头像信息 该方法触发后会自动弹出提示框,让用户选择头像,用户选择的头像会在 bindchooseavatar 指定的函数内获取,

    2024年02月11日
    浏览(81)
  • 微信小程序获取用户头像昵称

    微信小程序是一种基于微信开发平台的轻应用,用户可以通过微信扫码、搜索等方式进入小程序并使用。在小程序中,获取用户昵称和头像是非常常见的需求,因为这些信息可以用来个性化展示内容,提高用户体验。以下是获取用户头像昵称的传统方法: 在小程序中,可以通

    2024年02月07日
    浏览(64)
  • 微信小程序chooseAvatar获取头像

    1.wxml页面 2.js 拿临时地址上传到后台 3.如果没有弹窗,调整一下版本

    2024年03月22日
    浏览(48)
  • 微信小程序获取头像昵称 保存头像到服务器

    微信官方推荐的替代做法: 头像昵称填写 | 微信开放文档 (qq.com)  wxml js wxss

    2024年02月16日
    浏览(51)
  • 微信小程序最新获取头像昵称方式

      前言 版本历史变迁 一、获取头像的正确姿势 二、获取昵称的正确姿势 总结 产品需要获取微信用户的昵称和头像。 这这还不简单,so easy! 通过 wx.getUserProfile 或者  wx.getUserInfo  就可以获取到。 但是获取的昵称是”微信用户“获取的头像是灰色的头像。 如果你也是上面这

    2024年02月13日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包