微信小程序-多图片上传(基于Promise.all实现)

如你所了解到的,微信小程序的wx.uploadFile每次仅支持单文件上传。但在实际的应用场景中往往有多文件上传的需求。因此我打算用Promise.all对wx.uploadFile进行一层封装,让其能够实现多文件上传。

说在前面:若你了解Promise.all的用法.那么你一定知道这样封装的结果:同时上传多张图片,假如其中某一张上传失败,那么Promise.all将判定这次多图上传失败【上传失败的图片之前的图片实际上传了,上传失败的图片之后的图片不再上传】。

因此,若你的需求是在一次多图任务上传过程,必须每张图片上传成功才算本次多图上传任务成功,那么Promise.all封装很适合你,如果你只想多次执行wx.uploadFile且多次上传之间没有依赖关系,那么可以参考使用网上其他递归或for循环封装的方法,不建议采用promise.all。

一.封装wx.uploadFile

新建一个uploadFile.js文件

module.exports=function(filePath){
  return new Promise((resolve,reject)=>{
    wx.uploadFile({
      filePath:filePath //上传文件的文件路径
      name: 'pic',  //上传的文件名,主要用于后端定位该文件
      url: '后端的url',
      formData:{
        //本次请求中若需要其他参数,可在该部分写
         //例如 :
        //'picNumber':filename,
      },
      header:{
         //本次请求头中若需要其他参数,可在该部分写
        //例如:
       // "Authorization":"Bearer "+token
      },
      success:resolve,
      fail:reject
    })
  })
}

二.在页面中使用

        页面的js文件中进行如下配置

//引入文件
const upLoadFile = require('../../utils/upLoadFile')

//写一个send函数,并绑定到wxml的某个标签下
send(){
    //实际imgList表中的内容应该使用wx.chooseImage获取
  let files = this.data.imgList;  //图片URL数组,实际使用替换为自己的图片url数组
  let uploads =[];  //构建的promise数组
  files.forEach((item,index)=>{  //item为图片的url
    uploads.push(upLoadFile(item))
  })
   Promise.all(uploads).then(res=>{
   console.log("图片部分发送完成",res)
   })
}

          若你需要 wx.chooseImage获取来imgList,可以参考如下代码:默认每次任务最多上传九张图

  ChooseImage() {
    wx.chooseImage({
      count: 9-this.data.imgList.length, //默认一次最多选9张
      sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
      sourceType: ['album'], //从相册选择
      success: (res) => {
        console.log("当前图片数组的长度:",this.data.imgList.length)
        if (this.data.imgList.length != 0 && this.data.imgList.length<=9) {
          this.setData({
            imgList: this.data.imgList.concat(res.tempFilePaths)
          })
        } else {
          this.setData({
            imgList: res.tempFilePaths
          })
        }
      }
    });
  },

获取的imgList参考


三.实现效果

后端采用的是node的koa框架进行图片保存处理

      1.前端

        前端点击发送后,后端成功返回Promise数组中所有promise的resolve数组

         2.后端

                可看到此时后端已成功收到前端发送的图片,并保存到了服务器中。

 

        本文只提供了简单的封装思路,代码中没有进行异常捕获的处理,大家在使用时可自行进行异常处理。

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
微信小程序中的Promise用于处理异步操作。Promise是一个对象,它可以获取异步操作的结果。通过封装微信小程序内置的wx.request()请求方法,我们可以使用Promise实现对请求的封装。这样可以更加方便地管理异步操作。 使用Promise封装微信小程序内置的wx.request()请求方法,可以使其支持Get和Post请求。具体实现可以参考以下步骤: 1. 创建一个封装函数,例如request(url, method, data)。这个函数可以接受请求的URL、请求方法和数据作为参数。 2. 在封装函数内部,创建一个新的Promise对象,并在Promise的构造函数中传入一个回调函数。这个回调函数接受两个参数:resolve和reject,分别代表异步操作成功和失败的情况。 3. 在回调函数内部,使用wx.request()方法发送请求。根据传入的请求方法和数据,设置wx.request()的相关参数。 4. 在wx.request()的success和fail回调函数中,分别调用resolve和reject来处理异步操作的结果。如果请求成功,调用resolve并传递返回的数据;如果请求失败,调用reject并传递错误信息。 5. 返回Promise对象,以便在调用封装函数时可以通过Promise的then()和catch()方法来处理异步操作的结果。 通过这样的封装,我们可以更方便地使用Promise来处理微信小程序中的异步操作,提高代码的可读性和可维护性。同时,可以使用Promise的链式调用来处理多个异步操作的依赖关系,使代码更加清晰易懂。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [微信小程序promise方式封装请求文件request.js](https://download.csdn.net/download/Isuty/12024321)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [微信小程序学习第8周————Promise](https://blog.csdn.net/g18204746769/article/details/109253375)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [小程序Promise](https://blog.csdn.net/CaBCo/article/details/124502544)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值