微信小程序上传头像和昵称持久化保存
1. 持久化步骤
因为通过微信头像昵称填写功能获取到头像是一个临时头像,这个url只能一段时间内在微信访问,并且无法在公网访问这个url。所以非常有必要把这个url转成我么实际可用的头像到数据库中。让头像持久化的在微信和公网任何位置都能访问。
这里我们使用url转base64字符串的方式,持久化图片成base64字符串。如果是自己上传图片还需要考虑图片大小和压缩图片的问题,这里我们直接采用微信的头像上传接口,直接帮我们快捷压缩和裁剪图片,灰常的好用。话不多说,来看代码
2. 页面效果
3. 代码实现
1. uniapp小程序
安装image-tools
npm i image-tools --save
2. 原生小程序
新建一个util工具类js。加上一个function
/** * 图片url链接转base64 * @param {String} url 图片链接 * @returns 转base64后的值或者报错信息 */ const imgUrlToBase64 = (url) => { return new Promise((resolve, reject) => { if (!url) { reject('请传入url内容'); } if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(url)) { // 图片地址 const image = new Image(); // 设置跨域问题 image.setAttribute('crossOrigin', 'anonymous'); // 图片地址 image.src = url; image.onload = () => { const canvas = document.createElement('canvas'); const ctx = canvas.getContext('2d'); canvas.width = image.width; canvas.height = image.height; ctx.drawImage(image, 0, 0, image.width, image.height); // 获取图片后缀 const ext = url.substring(url.lastIndexOf('.') + 1).toLowerCase(); // 转base64 const dataUrl = canvas.toDataURL(`image/${ext}`); resolve(dataUrl || ''); } } else { // 非图片地址 reject('非(png/jpe?g/gif/svg等)图片地址'); } }); };
2. 页面使用
1. 完善用户信息(昵称头像)弹窗
<u-modal v-model="showAuthorizeUser" :show-title="false" :show-confirm-button="false"> <view class="slot-content"> <div class="auth-card"> <div class="img"> <img class="avatar-img" :src="userInfoTemp.avatarurl" v-if="userInfoTemp.avatarurl&& userInfoTemp.avatarurl!=''" mode="widthFix"> <img class="avatar-img" v-else src="/static/logo-min.png" mode="widthFix"> </div> <div class="title">{{bname}}</div> <div class="content">邀请您补全个人信息<br></br>(昵称、头像)</div> <div style="margin-left: 100rpx;margin-right: 100rpx"> <u-form ref="uForm"> <u-form-item label="头像"> <button class="avatar-wrapper" open-type="chooseAvatar" @chooseavatar="onChooseAvatar" slot="right"> <image class="avatar" :src="userInfoTemp.avatarurl" v-if="userInfoTemp.avatarurl&& userInfoTemp.avatarurl!=''"></image> <image class="avatar" v-else src="/static/logo-min.png"></image> </button> </u-form-item> <u-form-item label="昵称"> <input type="nickname" class="weui-input" @blur="userNameInput" placeholder="请输入昵称"/> </u-form-item> </u-form> </div> </div> <div class="auth-btncard"> <div class="btn-unok"><u-button :hair-line='false' :custom-style="customStyleUnOk" @click="showAuthorizeUser=false"> 拒绝</u-button></div> <div class="btn-ok"><u-button :hair-line='false' :custom-style="customStyleOk" @click="authUser"> 允许</u-button></div> </div> </view> </u-modal>
2. js部分
<script> import { pathToBase64, base64ToPath } from 'image-tools' //如果是原生小程序这里就import我们写的那个function。图片url转base64的 export default { data() { return { userInfoTemp:{ id:'', name:'', avatarurl:'' }, customStyleUnOk: { marginTop: '20rpx', // 注意驼峰命名,并且值必须用引号包括,因为这是对象 border:'none', color:'gray' }, customStyleOk: { marginTop: '20rpx', // 注意驼峰命名,并且值必须用引号包括,因为这是对象 border:'none', color:'#157DFB' }, // 用户基本信息 userInfo: null, // 是否弹出登录注册授权弹窗 showAuthorizeUser: false, } }, methods: { openUserSet(){ this.userInfoTemp.id = this.userInfo.id; this.userInfoTemp.name = this.userInfo.name; this.userInfoTemp.avatarurl = this.userInfo.avatarurl; console.log(this.userInfoTemp) this.showAuthorizeUser = true; }, authUser(){ if(this.userInfoTemp.name && this.userInfoTemp.name!=''){ if(this.userInfoTemp.avatarurl && this.userInfoTemp.avatarurl!=''){ this.showAuthorizeUser = false; this.$api.saveUserInfo(this.userInfoTemp, res => { this.userInfo.name = this.userInfoTemp.name; this.userInfo.avatarurl = this.userInfoTemp.avatarurl; uni.setStorageSync('userInfo',this.userInfo) this.$interactive.toast('保存成功!') this.showAuthorizeUser = false; }) }else{ this.$interactive.toast('头像不能为空!') } }else{ this.$interactive.toast('昵称不能为空!') } }, //获取昵称输入内容 userNameInput(e){ this.userInfoTemp.name = e.detail.value }, onChooseAvatar(e) { pathToBase64( e.detail.avatarUrl).then(path => { this.userInfoTemp.avatarurl = path }).catch(error => { console.log(error) }) } } } </script>
3. css部分
.auth-card{ text-align: center; .avatar-img{ width: 150rpx; height: 150rpx; overflow: hidden; border-radius: 100%; margin-top: 30rpx; } .title{ font-size: 20rpx; } .content{ margin-top: 10rpx; } } .avatar-wrapper{ width: 150rpx; height: 100rpx; color: #333 !important; text-align: center !important; border: none !important; border-radius:0 !important; background-color:transparent !important; } .avatar-wrapper::after { border: none !important; } .auth-btncard{ .btn-unok{ width: 50%; float: left; } .btn-ok{ width: 50%; float: left; margin: 0; padding: 0; border: 0px solid transparent; //自定义边框 outline: none; //消除默认点击蓝色边框效果 u-button{ margin: 0; padding: 0; border: 0px solid transparent; //自定义边框 outline: none; //消除默认点击蓝色边框效果 } } }