微信小程序多图片上传实用代码记录

这篇具有很好参考价值的文章主要介绍了微信小程序多图片上传实用代码记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

微信小程序多图片上传实用代码记录

由于在小程序中,wx.uploadFile 只能一次上传一张图片,因此在一次需要上传多张图片的应用场景中例如商品图片上传、评论图片上传等场景下,不得不使用for等循环上传每一张图片,多次调用wx.uploadFile,由此引发了ajax的闭包问题。

初始代码

submit() {
    let tmparr = null;
    let _that = this;
    
    for (var k = 0; k < this.data.judgedetaillist.length; k++) {
      let _k = k;
      //图片上传
       this.data.fileList[_k].forEach((item) => { 
         wx.uploadFile({   //这里一定要用  wx.uploadFile 否则无法穿到后台
           filePath: item.url, //你要上传的路径
           name: 'file',   //你上传到后台的name值
           async: false, //设置为同步
           formData:{    // 如果你要验证你的token 可以用formData来给后台传值
             path:"judge"
           },
           url: 上传地址,
           success(res){
             let img = JSON.parse(res.data); 
             //录入到list
             if(img.err=='success' && img.c_url!=null && img.c_url!=undefined)
             {
               if(_that.data.judgedetaillist[_k].fileList.length==0 || _that.data.judgedetaillist[_k].fileList==null || _that.data.judgedetaillist[_k].fileList==undefined){
                _that.data.judgedetaillist[_k].fileList=[];
               }
               _that.data.judgedetaillist[_k].fileList.push({url:img.c_url});
               _that.setData({
                 judgedetaillist:_that.data.judgedetaillist
             })
             }
           }
         })
      })
    }
    console.log(JSON.stringify(this.data.judgedetaillist));
    return false;
  }

代码问题

我这代码的设想是,

遍历储存上传文件的 fileList数组-》wx.uploadFile上传到服务器-》返回服务器路径-》将返回的路径传送到 judgedetaillist.fileList中-》judgedetaillist传输到后台新增评论

这个代码执行下来会出现问题,即在 wx.uploadFile后获取了对应的url存储到judgedetaillist中后

console.log(JSON.stringify(this.data.judgedetaillist));

会出现

fileList":[]

但是
如果打印

console.log(this.data.judgedetaillist);

会出现

fileList: Array(1)
0:
url: “/upload/judge/16654684.png”
proto: Object
length: 1
nv_length: (…)
proto: Array(0)

在预设的对象中又能读取到数据,此时再打印

console.log(this.data.judgedetaillist[0].fileList.length);

发现明明数组中有对象,但是这个对象根本取不到,并且连length都无法读取

原因剖析

由于wx.uploadFile默认是使用异步,因此在不断的for循环中,它返回的值并不是同步的,导致多个同时执行,此时数组使用的是地址引用,并没有实际赋值成功,赋值的数组已经被修改了,因为原来的长度是0,所以获取不到数组,但又包含修改后的结果。
要解决这个bug就是让wx.uploadFile可以同步执行,需要用到
1、new Promise
2、async,await
3、取消forEach, forEach 中使用 async/await 时,异步操作并不会等待前一个操作结束再执行下一个,而是会同时执行多个异步操作

解决方案(非生产环境代码)

本来h5中的多图片上传是直接使用 async:false就可以,但是在微信中这是无效的。所以代码写成这样

解决方案一

使用new Promise,配合async,await进行多次循环

//图片上传函数
Upload: function (uploadFile) {
    return new Promise((resolve, reject) => {
      wx.uploadFile({   //这里一定要用  wx.uploadFile 否则无法穿到后台
        filePath: uploadFile, //你要上传的路径
        name: 'file',   //你上传到后台的name值
        formData: {    // 如果你要验证你的token 可以用formData来给后台传值
          path: "judge"
        },
        url: 上传路径,
        success: (res) => {
          // 上传完成操作
          const data = JSON.parse(res.data)
          resolve({
            data: data
          })
        },
        fail: (err) => {
          //上传失败:修改pedding为reject
          wx.showToast({
            title: "网络出错,上传失败",
            icon: 'none',
            duration: 1000
          });
          reject(err)
        }
      });
    })
  },
  
//接收返回的路径,关键是async ,await 
async submit() {
    let tmparr = null;
    for (var k = 0; k < this.data.judgedetaillist.length; k++) {
      let _k = k;
      //图片上传
      for (let i = 0; i < this.data.fileList[_k].length; i++) {
        tmparr =await this.Upload(this.data.fileList[_k][i].url);
        if(this.data.judgedetaillist[_k].fileList==null || this.data.judgedetaillist[_k].fileList==undefined){
          this.data.judgedetaillist[_k].fileList=[];
        }
        this.data.judgedetaillist[_k].fileList.push({ url: tmparr.data.c_url });
        this.setData({
          judgedetaillist: this.data.judgedetaillist
        })
      }
    }
    console.log(JSON.stringify(this.data.judgedetaillist));
}

解决方案二

利用Promise.all,当所有的异步请求成功后才会执行,将全部异步执行完后的数据一次性返回
调用测试

console.log(this.uploadImage(this.data.fileList[_k]))

返回结果
Promise {}
proto: Promise
[[PromiseState]]: “fulfilled”
[[PromiseResult]]: Array(3)
0: “/upload/judge/1691391628202skmda.png”
1: “/upload/judge/1691391628219ttxps.png”
2: “/upload/judge/1691391628227yehwf.png”
length: 3
nv_length: (…)
proto: Array(0)

利用这个可以一次性获取全部的结果

代码示例:文章来源地址https://www.toymoban.com/news/detail-639258.html

uploadImage: function(tempFilePaths){
    return new Promise((presolve,preject)=>{
      if({}.toString.call(tempFilePaths)!='[object Array]'){
        throw new TypeError(`上传图片参数 tempFilePaths 类型错误!`)
      }
      //路径数组为空时  不上传
      if(tempFilePaths.length==0){
        presolve([])
        return
      }
   
        let uploads = []
        tempFilePaths.forEach((item,i)=>{
          uploads[i] = new Promise ((resolve)=>{
            console.log(item);
            wx.uploadFile({   //这里一定要用  wx.uploadFile 否则无法穿到后台
              filePath: item.url, //你要上传的路径
              name: 'file',   //你上传到后台的name值
              formData: {    // 如果你要验证你的token 可以用formData来给后台传值
                path: "judge"
              },
              url: 你的上传路径,
              success(res){
                console.log(res);
                resolve(JSON.parse(res.data).c_url)
              },
              fail(err){
                console.log(err)
              }
            })
          })
        })
   
        Promise.all(uploads).then(res=>{
          //图片上传完成
          presolve(res)
        }).catch(err=>{
          preject(err)
          wx.showToast({
            title:'上传失败请重试',
            icon:'none'
          })
        })
    })
  },

到了这里,关于微信小程序多图片上传实用代码记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序上传文件(图片)至阿里云OSS,包含后端代码示例。

    ps:本文较为详细,需要有耐心的阅读,要是图片看不清楚可以下载到本地放大查看。 写这篇博客的主要目的是因为serverless架构下直接上传图片只能转base64,且body大小有限制 一、在阿里云创建RAM用户与角色 1.为什么要使用RAM用户? 云账号 AccessKey 是您访问阿里云 API 的密钥,具

    2024年02月04日
    浏览(50)
  • GPT问答记录:微信小程序动态tabBar开发配置(服务端+前端代码)

    答1: 好的,下面是一个具体的方案供你参考,包括数据库表设计、Java 后台代码和小程序前端代码。请注意,这个方案仅供参考,具体实现可能需要根据你的实际需求进行调整。 数据库表设计 首先,需要设计一个 tabBar 数据表来存储 tabBar 配置信息,该表包含以下字段: i

    2023年04月22日
    浏览(53)
  • 微信小程序上传图片写法

    小程序上传图片需要用到小程序API中的wx.uploadFile()方法。以下是一个基本的示例代码: 在这个示例代码中,首先使用wx.chooseImage()方法让用户选择一张图片,然后通过wx.uploadFile()方法将选中的图片上传到指定的接口地址。在上传成功后,我们可以在success回调函数中获

    2024年02月11日
    浏览(83)
  • 微信小程序上传并显示图片

    实现效果: 上传前显示: 点击后可上传,上传后显示: 源代码:  .wxml

    2024年01月18日
    浏览(66)
  • 微信小程序上传图片压缩方案

    小程序上传图片需要进行压缩,可以使用wx.getFileSystemManager()方法将图片转换成base64格式,再使用canvas将图片压缩成指定大小。 首先使用wx.chooseImage()方法选择了一张图片,然后使用wx.getFileSystemManager()方法将图片转换成base64格式。接着使用canvas进行压缩,并将canvas转换成图片

    2024年02月11日
    浏览(67)
  • 微信小程序原生上传图片和预览+云函数上传

    展示     1.2.1 uploadPage 说明:调用方法就是属性值是一个函数,因此要注意this问题。要将this指向原来的位置。 展示  说明:点击上传页面展示,在这里我点击了两次 !   1.2.2uploadPreview 说明:需要学习Array.map方法的使用。  展示 说明:点击图片后全屏显示  1.2.3deleteImage按

    2024年02月06日
    浏览(118)
  • 微信小程序实现图片上传(清晰版)

    在wxml文件中添加一个按钮和一个image标签用于显示上传的图片 在js文件中添加选择图片和上传图片的方法

    2023年04月16日
    浏览(96)
  • 微信小程序上传文件及图片(可以预览)

    最近在写小程序项目,碰到了一个需求,需要用户可以上传各种类型的文件和图片,展示在页面上,并且点击还可以进行预览,就找了找微信小程序官网,写了一个例子,分享一下 直接看代码: wxml: wxss: js: 有问题和建议欢迎大家留言

    2024年02月12日
    浏览(55)
  • 微信小程序对上传的图片进行裁剪

    背景: 使用uniapp中uni.chooseImage的裁剪参数crop只能在App中生效,在微信小程序中不生效。 实现思路 uni.chooseImage 打开相册获取图片路径(uni.chooseImage(OBJECT) | uni-app官网 (dcloud.net.cn)) 将获取到的图片路径传入 wx.cropImage 对图片进行裁剪(wx.cropImage(Object object) | 微信开放文档 (q

    2024年02月04日
    浏览(55)
  • 微信小程序 图片上传与内容安全审核

    之前有开发一个微信小程序,拥有图片上传的功能,上线运行后一直表现良好,用户渐渐增多。 但突然有一天,收到一个系统消息:提示我小程序存在内容安全风险,缺乏对不法违规内容的过滤机制,需要整改,消息如下图: 该消息是安全风险警告,需要限期内进行整改调

    2024年01月16日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包