微信头像上传“巨坑”复盘:告别 getUserProfile,拥抱 uploadFile 的正确姿势 🚀

嘿,各位小程序开发者!👋

我为什么要写这篇博客? 因为一个时代的终结,往往伴随着无数开发者的阵痛。曾几何时,我们只需要一行 wx.getUserInfo 或 wx.getUserProfile,就能轻松弹窗,获取用户的头像和昵称。那是一个简单而美好的时代。

但是,那个时代已经过去了!

“为优化用户体验,wx.getUserInfo 将不再弹出授权窗口…推荐使用

2. 前端 .js:逻辑的编排

// my.js

import { uploadFile } from '~/api/wxProfile';

import { updateUserInfo } from '~/api/user';

Page({

async onChooseAvatar(e) {

try {

const { avatarUrl } = e.detail; // 1. 获取 "http://tmp/..." 路径

this.setData({ avatar: avatarUrl });

// 2. 调用封装好的上传方法

const res = await uploadFile(avatarUrl, 'avatars');

if (res.code === 0 && res.data && res.data.url) {

const permanentUrl = res.data.url; // 3. 拿到永久 URL

// 4. 将永久 URL 保存到数据库

await updateUserInfo({ avatar: permanentUrl });

this.setData({ avatar: permanentUrl });

}

} catch (error) { /* ... */ }

},

});

// uploadFile.js

export function uploadFile(filePath, folder = 'uploads') {

return new Promise((resolve, reject) => {

wx.uploadFile({

url: 'https://your-domain.com/api/file/upload',

filePath, // 传入 "http://tmp/..."

name: 'file', // 核心“暗号”,必须与后端 @RequestParam 一致

formData: { folder },

header: { 'Authorization': `Bearer ${wx.getStorageSync('token')}` },

success: (res) => resolve(JSON.parse(res.data)),

fail: reject

});

});

}

3. 后端 FileUploadController.java:接收并处理“快递”

// FileUploadController.java

@RestController

@RequestMapping("/api/file")

public class FileUploadController {

@Autowired

private OssUtil ossUtil;

@PostMapping("/upload")

public BaseResult handleFileUpload(

// 根据“品名”标签 'file',接收货物

@RequestParam("file") MultipartFile file,

@RequestParam("folder") String folder

) {

try {

// 1. 将收到的文件(二进制流)存入 OSS

String fileKey = ossUtil.uploadFile(file, folder, 1);

// 2. 生成一个新的、永久的“仓库地址”

String permanentUrl = ossUtil.getPublicUrl(fileKey);

Map responseData = new HashMap<>();

responseData.put("url", permanentUrl);

// 3. “回信”,告知新的“仓库地址”

return BaseResult.success("上传成功", responseData);

} catch (Exception e) {

return BaseResult.failure("上传失败");

}

}

}

关键点:@RequestParam("file") MultipartFile file 精准地接收了前端名为 file 的文件部分,并将其内容封装成了 MultipartFile 对象,供后续的 OssUtil 使用。

🧠 思维导图总结

告别 getUserProfile 时代的“拿来主义”,拥抱 uploadFile 时代的“自主可控”,这不仅仅是一次 API 的升级,更是一次后端架构思想的成熟。希望这份详尽的复盘,能帮助你构建出更加健壮、可靠的小程序应用!Happy coding! 🚀