1)场景:
小程序上传图片,常见于含有:图片识别、证件照处理、意见反馈等功能的小程序。
2)我们之前使用过几种方案:
- 使用七牛云上传图片sdk,通过获取token,上传到七牛云图片存储服务器。
- 使用腾讯云对象存储小程序sdk,后端通过获取临时token给到前端,上传到对象存储里(阿里云存储没用过,看过文档类似)。
- 使用云开发对象存储,返回fileID,小程序可直接使用,管理后台需要使用接口换取临时链接。
3)公司现在的需求:
- 尽可能提升上传性能和小程序性能
- 想统一迁移使用腾讯云服务(上传的图片,在管理后台也能查看)
4)重新对比方案:
- 七牛云和腾讯云对象存储都需要引入sdk,增加小程序代码包体
- 七牛云和腾讯云对象存储均需要维护token,相对麻烦一些
- 云开发使用很简单,内置sdk、同时发现可以通过拼接链接,解决临时链接问题,故使用云开发。
5)实现云开发上传图片:(需开通云开发)
// index.js
Page({
data: {},
async selImg() {
let res = await wx.chooseMedia({ count: 1 });
this.uploadImg(res.tempFiles[0].tempFilePath);
},
// 拿到临时链接,上传到云开发存储
async uploadImg(tempFilePath) {
let cloudPath = `mini/${Date.now()}.jpg`;
let { fileID } = await wx.cloud.uploadFile({
cloudPath,
filePath: tempFilePath,
});
// 获取图片https地址,可在html5使用
this.setData({ imgHttps: this.fileIDToHttps(fileID) });
},
// 图片地址: fileID 转 https
fileIDToHttps(url) {
let res = url;
if (url.indexOf("cloud://") === 0) {
const first = url.indexOf(".");
const end = url.indexOf("/", first);
res =
"https://" +
url.slice(first + 1, end) +
".tcb.qcloud.la/" +
url.slice(end + 1, url.length);
}
return res;
},
});
6)防坑小提示:
如果开发环境能上传成功,正式版不能上传成功,2种解决方案:
- app.json去掉: "cloud": true
- 配置uploadFile合法域名:https://cos.ap-shanghai.myqcloud.com
7)使用mp-uploader组件实现上传图片