微信小程序之云开发的uploadFile
在开发微信小程序的时候,图片上传必不可少的,自从有了云开发,问题就来了,小程序给我们提供了两个云开发的图片上传接口。
一个是小程序端的 uploadFile, 如下
wx.cloud.uploadFile
将本地资源上传至云存储空间,如果上传至同一路径则是覆盖写
请求参数
| 字段 | 说明 | 数据类型 | 默认值 | 必填 |
|---|---|---|---|---|
| cloudPath | 云存储路径,命名限制见文件名命名限制 | String | - | Y |
| filePath | 要上传文件资源的路径 | String | - | Y |
| header | HTTP 请求 Header, header 中不能设置 Referer | Object | - | N |
| config | 配置 | Object | - | N |
| success | 成功回调 | |||
| fail | 失败回调 | |||
| complete | 结束回调 |
一个是服务端的 uoloadFile,如下:
uploadFile
将本地资源上传至云存储空间,如果上传至同一路径则是覆盖。
请求参数
| 字段 | 说明 | 数据类型 | 默认值 | 必填 |
|---|---|---|---|---|
| cloudPath | 云存储路径,命名限制见文件名命名限制 | String | - | Y |
| fileContent | 要上传文件的内容 | Buffer 或 fs.ReadStream | - | Y |
小程序端的 uploadFile是及其简单的一个普通接口,直接配合 wx.chooseImage 使用即可。
但是服务端的 uploadFile 却是有坑了,因为他是写在云函数里面的,于是,上传的图片只能从 云函数对应的文件夹(云端) 里取,不能从本地取
我直接用的小程序端那一套来套服务端的 uploadFile接口,直接就报错了, 报错 是:文件不存在
于是,经过google一番搜索,最终找到以下文章:
https://www.cnblogs.com/masterchd/p/10662313.html
它的解决方法是,就在小程序端将其进行编码转化为stream流 直接传给 云函数里的uploadFile的参数 fileContent,并用 new Buffer(fileContent)解码,便可以了。
代码如下:
const tempFilePaths = res.tempFilePaths
wx.getFileSystemManager().readFile({
filePath: tempFilePaths[0],
encoding: 'base64',
success: res => {
wx.cloud.callFunction({
name: 'uploadFile',
data: {
cloudPath: 'test.jpg',
fileContent: res.data
}
}).then(res => {
db.collection('images').add({
data: {
fileID: res.result.fileID
},
success: res => {
console.log(res);
},
fail: err => {
console.log(err);
}
})
}).catch(err => {
console.log(err);
})
},
fail: err => {
console.log(err);
}
})