微信小程序上传头像的临时路径,持久化保存到服务器与数据库(nodejs后台开发)

从微信小程序中返回的用户头像临时地址 http://tmp/H0GP7BW5HTQs846c0d9deef32d42f2203340efc4a5c3.jpeg 会失效,且只能一段时间内在微信访问,并且无法在公网访问用户头像临时地址avatarUrl。

所以需要将临时地址avatarUrl转成实际可用的地址保存到mysql数据库的wxusers表的avatarUrl列中,同时将新的图片路径保存到服务器的./public/upload目录下。

一开始我是这么写的:

微信小程序通过授权获取用户头像的wxml代码如下

<view class="btnavatar">
    <button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar"  value='{{avatarUrl}}'>
   <view>
    <image class="avatar" src="{{avatarUrl}}"></image>
   </view>
  </button>
</view>


对应的微信小程序TS代码如下

onChooseAvatar(e) {
const { avatarUrl } = e.detail 
this.setData({
  avatarUrl,
})
console.log("获取到用户输入的头像为"+ avatarUrl)
     // 登录
     var that = this;
     wx.login({
         success: function(res) {
             //console.log(res.code)
             // 发送 res.code 到后台换取 openId, sessionKey, unionId
             if (res.code){
                 wx.request({
                     url: config.apiUrl + '/api/getOpenid',
                     method: 'POST',
                     data:{
                         code:res.code,
                     },
                     success:function(response){
                         console.log("成功获取到用户openid 下面开始获取头像:",response.data.openid)
                         const openid = response.data.openid;
wx.request({
    url: config.apiUrl + '/api/avatarUrl',
    method: 'POST',
    data: {
        openid,
        avatarUrl,
    },
    success: function(res) {
        console.log('submit success');
        console.log("成功获取到用户头像存入数据库:",avatarUrl)
    },
    fail: function(res) {
        console.log('submit fail');
    }
})
}
})
}else{
console.log('wx.login()调用失败!'+res.errMsg);
}
}
})
},


以nodejs为后台保存头像到mysql数据库的路由代码如下

const express = require('express');
const router = express.Router();
const sql = require('../sql');
const request = require("request");
//存入头像
router.post('/avatarUrl', (req, res) => {

    const openid = req.body.openid;
    const avatarUrl = req.body.avatarUrl;
    const nickname = req.body.nickname;
    const phoneNumber = req.body.phoneNumber;
    const unionid = req.body.unionid;

    // 创建MySQL查询
    const sqlStr = 'SELECT * FROM wxusers WHERE openid = ?';
    //res.json({openid: openid});
    console.log(`查询到了`)
    // 查询数据库
    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.send('Data updated in the database.');
                });
            } else {
                const sqlStr = `INSERT INTO wxusers (openid, avatarUrl, nickname, phoneNumber, unionid) VALUES ('${openid}','${avatarUrl}', 'default_user', 'default_user', 'default_user')`;
                sql.query(sqlStr, [openid, avatarUrl, nickname, phoneNumber, unionid], (err, result) => {
                    if (err) throw err;
                    res.send('Data inserted into the database.');
                });
            }
        }
    });

});

module.exports = router;

接下来是第二次修改的,微信开发者工具在本地测试没有问题:

微信小程序通过授权获取用户头像的wxml代码如下:

    <view data-weui-theme="{{theme}}" class="view-2">
   <button class="avatar-wrapper" open-type="chooseAvatar" bind:chooseavatar="onChooseAvatar"  value='{{avatarUrl}}'>
   <view>
    <image class="avatar" src="{{avatarUrl}}"></image>
   </view>
  </button>


对应的微信小程序TS代码如下:

onChooseAvatar(e) {
    const { avatarUrl } = e.detail
    this.setData({
    avatarUrl,
    })
    console.log("获取到用户头像avatarUrl:"+ avatarUrl)
    // 下载头像图片
    wx.downloadFile({
    url: avatarUrl,
    success(res) {
    if (res.statusCode === 200) {
    console.log('download success');
    const tempFilePath = res.tempFilePath
    console.log("获取到用户头像tempFilePath:"+ tempFilePath)
    // 上传下载的图片
    wx.uploadFile({
    url: config.apiUrl + '/api/avatarUrl',
    filePath: tempFilePath,
    name: 'file',
    formData: {
    'openid': wx.getStorageSync('openid')
    },
    success(res) {
    const data = JSON.parse(res.data)
    console.log('upload success');
    console.log("成功获取到用户头像存入数据库:", data.path);
    },
    fail(res) {
    console.log('upload fail');
    }
    })
    }
    }
    })
    },


以nodejs为后台保存头像到mysql数据库的路由代码如下:

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

// 设置文件上传的目录
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) => {
    const openid = req.body.openid;
    const avatarUrl = '/upload/' + req.file.filename;

// 创建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;

本地运行后微信开发者显示下面的内容:

 然后将服务搬到服务器上运行之后,开始报错:

 目前解决办法我也已经找到了:点击阅读完美解决方案icon-default.png?t=N6B9http://t.csdn.cn/nI1pI

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
扫码点餐微信小程序是一种新型的点餐方式,充分利用了微信的便捷性和用户群体广泛的特点。在这种方式下,用户只需运用微信扫描餐厅的二维码,就可以通过微信小程序进行点餐。而基于微信小程序开发技术,结合uniapp、vue及nodejs后台管理系统,可以为扫码点餐提供更多的便捷和实用性。 首先,微信小程序开发使得扫码点餐过程更加简洁高效。开发人员能够快速搭建一个具有后台能力的小程序,无需自行搭建服务器数据库等,极大地降低了开发和部署的难度。同时,云开发还提供了云函数和云数据库等服务,使得点餐系统具备实时更新菜单、实时下单等强大功能。 其次,uniapp作为一个跨平台的开发框架,可以同时兼容微信、支付宝、百度等各个小程序平台。这意味着我们可以使用相同的代码逻辑来开发和维护多个小程序版本,提高了开发效率和用户体验。同时,uniapp还提供了一套丰富的UI组件库,可以快速搭建出漂亮的小程序界面。 再者,vue作为一种流行的前端开发框架,为微信小程序开发提供了强大的组件化能力和响应式的数据绑定功能。开发人员可以通过vue的开发方式,更加方便地管理和维护小程序的各种模块和组件,提高了代码的可维护性和复用性。 最后,nodejs作为一个基于Chrome V8引擎的后台开发技术,可以提供高效的异步IO操作和事件驱动的编程模型。它的事件循环机制使得扫码点餐系统能够以高性能运行,处理大量的并发请求。同时,nodejs的模块化开发和丰富的第三方库生态系统,也为后台管理系统的开发提供了很多方便和便捷的工具。 综上所述,通过扫码点餐微信小程序开发技术,结合uniapp、vue和nodejs后台管理系统,我们可以搭建出一个高效、实用且易于扩展的点餐系统,为用户提供更好的用餐体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盒子猫君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值