如下是我downloadFile的js代码,上传至云储存的文件已经在上传时加入了openid,上传后的文件名为o_g_x'x'x'x'x'x'x_1677987552481404.docx,我设定了一个选择下载按钮。
请问各位大佬,如何实现在点击时系统自动获取下载者openid,与云储存文件夹中的文件名进行比对,让下载者可以下载到有与其openid相同的文件名的文件?o,
是_g_p4mITwmoDySizijWfwLeUb2Q_1677987552481404.docxo_g_p4mITwmoDySizijWfwLeUb2Q_1677987552481404.docx
Page({
/**
* 页面的初始数据
*/
data: {
envId: '',
fileSrc: '',
},
onLoad(options) {
this.setData({
envId: options.envId
});
},
// 获取当前用户的 OpenID
getOpenId() {
return new Promise((resolve, reject) => {
wx.cloud.callFunction({
name: 'quickstartFunctions',
config: {
env: this.data.envId
},
data: {
type: 'getOpenid'
},
success: res => {
resolve(res.result.OPENID);
},
fail: err => {
console.error('get openid failed with error:', err);
reject(err);
}
});
});
},
downloadFile() {
const that = this;
this.getOpenId().then(openid => {
that.setData({
uploaderOpenId: openid
});
wx.cloud.callFunction({
name: 'quickstartFunctions',
config: {
env: this.data.envId
},
data: {
type: 'downloadFileByOpenid',
fileType: 'file',
openid: openid // Add this line
}
}).then(res => {
console.log('获取文件信息成功', res);
const fileList = res.result;
if (fileList.length > 0) {
for (let i = 0; i < fileList.length; i++) {
const fileID = fileList[i].fileID;
if (fileID.indexOf('my-file') !== -1) {
if (fileID.indexOf(openid) !== -1) { // 如果文件名包含了下载者的openid,则说明这是下载者上传的文件
wx.cloud.downloadFile({
fileID: fileID,
success: res => {
console.log('下载成功', res.tempFilePath);
wx.showToast({
title: '下载成功',
duration: 2000
});
that.setData({
fileSrc: res.tempFilePath
});
},
fail: err => {
console.error('下载失败', err);
wx.showToast({
title: '下载失败',
icon: 'none'
});
}
});
return;
}
}
}
console.log('该用户没有上传文件');
wx.showToast({
title: '该用户没有上传文件',
icon: 'none'
});
} else {
console.log('该用户没有上传文件');
wx.showToast({
title: '该用户没有上传文件',
icon: 'none'
});
}
}).catch(err => {
console.error('获取文件信息失败', err);
wx.showToast({
title: '获取文件信息失败',
icon: 'none'
});
});
});
}
});
如下是对应的云函数代码
const cloud = require('wx-server-sdk')
cloud.init()
// getOpenid云函数入口函数
exports.main = async (event, context) => {
let {OPENID,APPID}=cloud.getWXContext()
return {
OPENID,
APPID
}
}
const cloud = require('wx-server-sdk')
cloud.init()
// downloadFileByOpenid云函数入口函数
exports.main = async (event, context) => {
const db = cloud.database();
const MAX_LIMIT = 100;
const openid = event.openid;
const fileType = event.fileType;
const countResult = await db.collection('my-files')
.where({
fileType: fileType,
uploaderOpenId: openid
})
.count();
const total = countResult.total;
const batchTimes = Math.ceil(total / MAX_LIMIT);
const tasks = [];
for (let i = 0; i < batchTimes; i++) {
const promise = db.collection('my-files')
.where({
fileType: fileType,
uploaderOpenId: openid
})
.skip(i * MAX_LIMIT)
.limit(MAX_LIMIT)
.orderBy('uploadTime', 'desc')
.get();
tasks.push(promise);
}
// 等待所有任务完成
const files = (await Promise.all(tasks)).reduce((acc, cur) => {
return {
data: acc.data.concat(cur.data),
errMsg: acc.errMsg,
}
});
return files;
}
把openid跟云存储文件的关联关系保存到数据库把
https://developers.weixin.qq.com/community/develop/article/doc/000a868d6641b8b5923ec2c435b813
专门用一张表来维护所有云存储文件。仅供参考。