持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天
1、为什么要使用云存储
云存储依托云开发,在开发基于云开发的微信小程序时,微信为开发者提供了一块存储空间,我们可以将文件上传到云端,同时也可以从云端下载资源,也就方便了用户之间的交互。例如项目的Logo图片可以通过云开发控制台提起上传到云端。项目在执行的过程中也会涉及文件的操作,例如用户上传图片的操作,这时就需要用到云开发存储API。
2、云存储相关API
小程序云开发提供了一系列存储操作API,有uploadFile()文件上传接口、downloadFile()下载文件接口、deleteFile()删除文件接口和getTempFileURL()换取临时链接接口。
wx.cloud.uploadFile()接口的参数列表如下所示。如果采用callback风格,调用回调函数success、fail、complete中的任何一个,则会返回一个UploadTask对象(封装返回信息的对象),通过UploadTask对象可监听上传事件。
| 字段 | 说明 | 数据类型 | 默认值 | 必填 |
|---|---|---|---|---|
| cloudPath | 云存储路径 | String | - | 是 |
| filePath | 要上传文件资源的路径 | String | - | 是 |
| config | 配置 | Object | - | 否 |
| success | 成功回调 | |||
| fail | 失败回调 | |||
| complete | 结束回调 |
3、实例
假设我们有一个需求是用户发布一个类似朋友圈的消息,在小程序中,将相关内容存入数据库,我们可以将用户发布的文字存入数据库,但是如果用户想要发图片了,如何存储,有人可能会想这还不简单,把图片的地址存一下,下次直接加载不就行了,那地址是什么了,你确定下次加载的时候还在吗,这么多问题就不考虑了,很简单直接存储到云开发提供的空间中去,下面是一个将照片存储到云函数的代码
// 让用户选择一张图片
wx.chooseImage({
success: chooseResult => {
// 将图片上传至云存储空间
wx.cloud.uploadFile({
// 指定上传到的云路径
cloudPath: 'photo.jpg',
// 指定要上传的文件的小程序临时文件路径
filePath: chooseResult.tempFilePaths[0],
// 成功回调
success: res => {
console.log('上传成功', res)
},
})
},
})
这只是一个普通的代码,就是用户选择一张照片将其存入进去,然后在云开发控制台存储中看到那张照片,可是如果你再选择一张就会发现第一次的照片没了,只有新传上去的一张照片,这是为什么了,可以看到有一个叫做cloudPath的属性,从名字上看就知道啥意思了,云路径,也就是上传之后照片的在云存储中的路径,路径设置一样后来者当然把前面的给抵消了
4、上传路径唯一问题
用户上传的内容存储到数据库中我们都会设置一个唯一索引_id,一般来说这个id是唯一的,所以我们可以以此来作为存储的路径名
const uploadTasks = fileList.map((file, index) =>
this.uploadFilePromise(`${res._id}.jpg`, file) //存储数据后获得该记录的_id
);
Promise.all(uploadTasks)
.then(data => {
//wx.showToast({ title: '上传成功', icon: 'none' });
Toast.success("发布成功");
const fileList = data.map(item => ({ url: item.fileID }));
console.log(data[0].fileID)
this.setData({ cloudPath: data, fileList: fileList });
})
.catch(e => {
wx.showToast({ title: '发布失败', icon: 'none' });
console.log(e);
});
}
//文件上传
uploadFilePromise(fileName, chooseResult) {
return wx.cloud.uploadFile({
cloudPath: fileName,
filePath: chooseResult.path
});
},
烟火向星辰,所愿皆成真!