收藏
回答

上传云储存的文件加入了上传者的openid,如何实现选择下载时,可以下载到含其openid的文件?

如下是我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;
}


回答关注问题邀请回答
收藏

2 个回答

登录 后发表内容