【小程序】一次最多选择9张,多张图片递归上传

需求

一次最多选择9张,多张图片递归上传。

思路

  1. 选择完图片,以递归的方式通过wx.uploadFile上传图片。
  2. 回显缩略图。

代码实现

步骤一

上传组件中的uploadOneByOne方法传入选择的图片列表,一张张的通过wx.uploadFile上传到微信服务器。

    /**
     * 附件上传
     */
    onUpload: function () {
      let currentPage = this;
      wx.chooseMedia({
        count: 9,
        mediaType: ["image"],
        sourceType: ["album", "camera"],
        sizeType: ["compressed"],
        camera: "back",
        success(res) {
          for (let i = 0; i < res.tempFiles.length; i++) {
            const item = res.tempFiles[i];
            if (item.size == 0 || item.size > 30000000) {
              ui.showToast("上传文件大小超过限制", 1000, "none");
              return;
            }
          }
          let successUp = 0; //成功
          let failUp = 0; //失败
          let count = 0; //第几张
          let length = res.tempFiles.length; //总数
          let list = [];
          currentPage.uploadOneByOne(
            res.tempFiles,
            list,
            successUp,
            failUp,
            count,
            length
          );
        },
      });
    },
    /**
     * 附件删除
     */
    onDelete: function (e) {
      let currentPage = this;
      let { index } = e.currentTarget.dataset;
      currentPage.triggerEvent("deleteevent", {
        onDelete: true,
        fileIndex: index,
      });
    },
    /**
     * 上传图片:以递归的方式上传
     * imgPaths:上传的图片列表
     * fileList:上传成功后返回的文件信息
     * successUp:上传成功的个数,初始化为0
     * failUp:上传失败的个数,初始化为0
     * count:第几张
     * length:图片列表的长度
     */
    uploadOneByOne(imgPaths, fileList, successUp, failUp, count, length) {
      let that = this;
      let imgPath = imgPaths[count].tempFilePath;
      let index = imgPath.lastIndexOf("/");
      let filename = imgPath.substring(index + 1, imgPath.length);
      let data = new FormData().getData();
      wx.uploadFile({
        url: `${app.globalData.baseUrl}/file/upload`,
        filePath: imgPath,
        name: "file",
        header: {
          Authorization: "Bearer " + that.data.access_token,
          "content-type": data.contentType,
        },
        formData: {
          filename: filename,
        },
        success: function (e) {
          // 坑:与wx.request不同的是,upload返回的是字符串格式,需要字符串对象化
          const file = JSON.parse(e.data);
          if (e.statusCode == 200) {
            fileList.push({ onSuccess: true, file: file.data, filename });
            successUp++; //成功+1
          }
        },
        fail: function (e) {
          console.log(e, "上传失败");
          failUp++; //失败+1
        },
        complete: function (e) {
          count++; //下一张
          if (count == length) {
            //上传完毕,作一下提示
            ui.showToast(
              `上传成功 ${successUp} 张,失败 ${failUp}`,
              1000,
              "none"
            );
            that.triggerEvent("successevent", {
              onSuccess: true,
              files: fileList,
            });
          } else {
            //递归调用,上传下一张
            that.uploadOneByOne(
              imgPaths,
              fileList,
              successUp,
              failUp,
              count,
              length
            );
          }
        },
      });
    },

步骤二

在使用到组件的页面进行附件上传成功、附件删除成功后的回调处理。
上传微信服务器成功后,才开始进行真正的上传服务器操作。这里需要注意要异步请求、异步更新附件信息关联对应的订单类型。

  /**
   * 附件上传、删除成功后的回调
   * 指定索引更新缩略图 未做
   */
  updateFile: function (e) {
    let currentPage = this;
    let { onDelete, onSuccess, fileIndex, files } = e.detail;
    let { loscamOrderId } = currentPage.data.form;
    let tableType = "pallet_issue";
    let list = currentPage.data.fileList;
    if (onSuccess) {
      for (let i = 0; i < files.length; i++) {
        const ele = files[i];
        let file = {
          ...ele.file,
          name: ele.filename,
          filename: ele.filename,
          tableType: tableType,
          url: `${app.globalData.baseUrl}/file/downloadfile?fileUrl=${ele.objectId}`,
        };
        list.push(file);
      }
      if (loscamOrderId) {
        currentPage.updateFileById(tableType, list, loscamOrderId);
      } else {
        list.forEach((item) => {
          item.filetype = item.name.split(".").pop().toLowerCase();
        });
        currentPage.setData({
          fileList: list,
        });
      }
    } else if (onDelete) {
      ui.showModal({ title: "确定删除文件?" }, function () {
        list.splice(fileIndex, 1);
        if (loscamOrderId) {
          currentPage.updateFileById(tableType, list, loscamOrderId);
        } else {
          list.forEach((item) => {
            item.filetype = item.name.split(".").pop().toLowerCase();
          });
          currentPage.setData({
            fileList: list,
          });
        }
      });
    }
  },
  updateFileById: function (type, list, id) {
    let currentPage = this;
    updateFile(list, {
      tableType: type,
      tableId: id,
    }).then(async (res) => {
      const data = res.data;
      if (data && data.length > 0) {
        for (let i = 0; i < list.length; i++) {
          const currentIndex = data.findIndex(
            (e) => e.objectId == list[i].objectId
          );
          if (!list[i].fileId) {
            let currentId = data[currentIndex].fileId;
            currentPage.setData({
              ["fileList[" + i + "].fileId"]: currentId,
            });
          }
        }
      }
      await updateFileNum(id, list.length);
      await currentPage.initFileList(type, id);
    });
  },
  // 有两种提交订单的方式所以把更新附件提取为一个方法进行调用
  updateFileList: function (id) {
    let currentPage = this;
    if (currentPage.data.loscamOrderId) {
      currentPage.updateFileById(
        "pallet_issue",
        currentPage.data.fileList,
        currentPage.data.loscamOrderId
      );
    }
    currentPage.initFileList("pallet_issue", id);
    currentPage.backToUpdatePage();
  },

步骤三

更新附件信息数据。

  /**
   * 初始化附件信息
   */
  initFileList: function (type, id) {
    let currentPage = this;
    getFileList(type, id).then((res) => {
      let list = res.data;
      if (list.length > 0) {
        list.forEach((item) => {
          item.filetype &&
            (item.filetype = item.name.split(".").pop().toLowerCase());
        });
      }
      currentPage.setData({
        fileList: list,
      });
    });
  },
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 好的,以下是一个使用 JavaScript 实现归的小程序示例: ```javascript function countDown(number) { console.log(number); if (number > 0) { countDown(number - 1); } } countDown(5); ``` 这个小程序会从给定的数字开始,减并输出每个数字,直到数字为零。它使用归调用 `countDown` 函数本身,每次入比上一次小 1 的数字作为参数。当数字减至零时,归停止。 当我们调用 `countDown(5)` 时,它会输出: ``` 5 4 3 2 1 0 ``` 这是归的一种简单示例,它可以通过不断调用自身,实现重复执行某个操作的效果。 ### 回答2: 下面是一个用JavaScript编写的小程序: ```javascript function factorial(num) { // 基本情况:如果数字为0或1,直接返回1 if (num === 0 || num === 1) { return 1; } // 归情况:将问题分解成更小的部分 else { return num * factorial(num - 1); } } // 调用函数计算5的阶乘 console.log(factorial(5)); ``` 这个程序是一个阶乘计算器,使用了归方法来计算给定数字的阶乘。阶乘是将一个正整数乘以小于它的正整数的连乘积。这个程序将问题分解为更小的部分,归地调用自身来解决子问题,直到达到基本情况时停止归。在这个程序中,基本情况是当数字为0或1时,返回1。否则,将数字乘以比它小1的阶乘结果,以此类推,直到计算得到最终的阶乘结果。最后,程序打印出计算得到的结果。 此程序的输出将是5的阶乘,即5 x 4 x 3 x 2 x 1 = 120。 ### 回答3: 下面是一个例子,展示了一个简单的 JavaScript 小程序,计算阶乘。 ``` function factorial(n) { // 基本情况:当 n 等于 0 或 1 时,直接返回 1 if (n === 0 || n === 1) { return 1; } // 归调用:将问题分解为更小的子问题 return n * factorial(n-1); } // 调用归函数,计算阶乘 var num = 5; var result = factorial(num); console.log(`计算 ${num} 的阶乘结果是:${result}`); ``` 以上代码定义了一个 `factorial` 函数,该函数使用了归的方式计算阶乘。首先,函数会检查基本情况,即 `n` 等于 0 或 1 时,直接返回 1。然后,函数会使用归调用,将问题分解为更小的子问题,即计算 `n-1` 的阶乘,并将结果与 `n` 相乘。最后,函数返回计算结果。 我们通过调用 `factorial` 函数来计算阶乘,入的参数为 5。计算完成后,结果会通过 `console.log` 打印在控制台上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

茶茶呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值