国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

微信小程序多圖片上傳實(shí)用代碼記錄

這篇具有很好參考價(jià)值的文章主要介紹了微信小程序多圖片上傳實(shí)用代碼記錄。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

微信小程序多圖片上傳實(shí)用代碼記錄

由于在小程序中,wx.uploadFile 只能一次上傳一張圖片,因此在一次需要上傳多張圖片的應(yīng)用場景中例如商品圖片上傳、評論圖片上傳等場景下,不得不使用for等循環(huán)上傳每一張圖片,多次調(diào)用wx.uploadFile,由此引發(fā)了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, //設(shè)置為同步
           formData:{    // 如果你要驗(yàn)證你的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;
  }

代碼問題

我這代碼的設(shè)想是,

遍歷儲存上傳文件的 fileList數(shù)組-》wx.uploadFile上傳到服務(wù)器-》返回服務(wù)器路徑-》將返回的路徑傳送到 judgedetaillist.fileList中-》judgedetaillist傳輸?shù)胶笈_新增評論

這個(gè)代碼執(zhí)行下來會出現(xiàn)問題,即在 wx.uploadFile后獲取了對應(yīng)的url存儲到j(luò)udgedetaillist中后

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

會出現(xiàn)

fileList":[]

但是
如果打印

console.log(this.data.judgedetaillist);

會出現(xiàn)

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

在預(yù)設(shè)的對象中又能讀取到數(shù)據(jù),此時(shí)再打印

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

發(fā)現(xiàn)明明數(shù)組中有對象,但是這個(gè)對象根本取不到,并且連length都無法讀取

原因剖析

由于wx.uploadFile默認(rèn)是使用異步,因此在不斷的for循環(huán)中,它返回的值并不是同步的,導(dǎo)致多個(gè)同時(shí)執(zhí)行,此時(shí)數(shù)組使用的是地址引用,并沒有實(shí)際賦值成功,賦值的數(shù)組已經(jīng)被修改了,因?yàn)樵瓉淼拈L度是0,所以獲取不到數(shù)組,但又包含修改后的結(jié)果。
要解決這個(gè)bug就是讓wx.uploadFile可以同步執(zhí)行,需要用到
1、new Promise
2、async,await
3、取消forEach, forEach 中使用 async/await 時(shí),異步操作并不會等待前一個(gè)操作結(jié)束再執(zhí)行下一個(gè),而是會同時(shí)執(zhí)行多個(gè)異步操作

解決方案(非生產(chǎn)環(huán)境代碼)

本來h5中的多圖片上傳是直接使用 async:false就可以,但是在微信中這是無效的。所以代碼寫成這樣

解決方案一

使用new Promise,配合async,await進(jìn)行多次循環(huán)

//圖片上傳函數(shù)
Upload: function (uploadFile) {
    return new Promise((resolve, reject) => {
      wx.uploadFile({   //這里一定要用  wx.uploadFile 否則無法穿到后臺
        filePath: uploadFile, //你要上傳的路徑
        name: 'file',   //你上傳到后臺的name值
        formData: {    // 如果你要驗(yàn)證你的token 可以用formData來給后臺傳值
          path: "judge"
        },
        url: 上傳路徑,
        success: (res) => {
          // 上傳完成操作
          const data = JSON.parse(res.data)
          resolve({
            data: data
          })
        },
        fail: (err) => {
          //上傳失?。盒薷膒edding為reject
          wx.showToast({
            title: "網(wǎng)絡(luò)出錯,上傳失敗",
            icon: 'none',
            duration: 1000
          });
          reject(err)
        }
      });
    })
  },
  
//接收返回的路徑,關(guān)鍵是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,當(dāng)所有的異步請求成功后才會執(zhí)行,將全部異步執(zhí)行完后的數(shù)據(jù)一次性返回
調(diào)用測試

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

返回結(jié)果
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)

利用這個(gè)可以一次性獲取全部的結(jié)果

代碼示例:文章來源地址http://www.zghlxwxcb.cn/news/detail-639258.html

uploadImage: function(tempFilePaths){
    return new Promise((presolve,preject)=>{
      if({}.toString.call(tempFilePaths)!='[object Array]'){
        throw new TypeError(`上傳圖片參數(shù) tempFilePaths 類型錯誤!`)
      }
      //路徑數(shù)組為空時(shí)  不上傳
      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: {    // 如果你要驗(yàn)證你的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'
          })
        })
    })
  },

到了這里,關(guān)于微信小程序多圖片上傳實(shí)用代碼記錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

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

    微信小程序上傳文件(圖片)至阿里云OSS,包含后端代碼示例。

    ps:本文較為詳細(xì),需要有耐心的閱讀,要是圖片看不清楚可以下載到本地放大查看。 寫這篇博客的主要目的是因?yàn)閟erverless架構(gòu)下直接上傳圖片只能轉(zhuǎn)base64,且body大小有限制 一、在阿里云創(chuàng)建RAM用戶與角色 1.為什么要使用RAM用戶? 云賬號 AccessKey 是您訪問阿里云 API 的密鑰,具

    2024年02月04日
    瀏覽(27)
  • GPT問答記錄:微信小程序動態(tài)tabBar開發(fā)配置(服務(wù)端+前端代碼)

    答1: 好的,下面是一個(gè)具體的方案供你參考,包括數(shù)據(jù)庫表設(shè)計(jì)、Java 后臺代碼和小程序前端代碼。請注意,這個(gè)方案僅供參考,具體實(shí)現(xiàn)可能需要根據(jù)你的實(shí)際需求進(jìn)行調(diào)整。 數(shù)據(jù)庫表設(shè)計(jì) 首先,需要設(shè)計(jì)一個(gè) tabBar 數(shù)據(jù)表來存儲 tabBar 配置信息,該表包含以下字段: i

    2023年04月22日
    瀏覽(24)
  • 微信小程序上傳圖片寫法

    小程序上傳圖片需要用到小程序API中的wx.uploadFile()方法。以下是一個(gè)基本的示例代碼: 在這個(gè)示例代碼中,首先使用wx.chooseImage()方法讓用戶選擇一張圖片,然后通過wx.uploadFile()方法將選中的圖片上傳到指定的接口地址。在上傳成功后,我們可以在success回調(diào)函數(shù)中獲

    2024年02月11日
    瀏覽(226)
  • 微信小程序上傳并顯示圖片

    微信小程序上傳并顯示圖片

    實(shí)現(xiàn)效果: 上傳前顯示: 點(diǎn)擊后可上傳,上傳后顯示: 源代碼:? .wxml

    2024年01月18日
    瀏覽(101)
  • 微信小程序上傳圖片壓縮方案

    小程序上傳圖片需要進(jìn)行壓縮,可以使用wx.getFileSystemManager()方法將圖片轉(zhuǎn)換成base64格式,再使用canvas將圖片壓縮成指定大小。 首先使用wx.chooseImage()方法選擇了一張圖片,然后使用wx.getFileSystemManager()方法將圖片轉(zhuǎn)換成base64格式。接著使用canvas進(jìn)行壓縮,并將canvas轉(zhuǎn)換成圖片

    2024年02月11日
    瀏覽(99)
  • 微信小程序原生上傳圖片和預(yù)覽+云函數(shù)上傳

    微信小程序原生上傳圖片和預(yù)覽+云函數(shù)上傳

    展示 ? ? 1.2.1 uploadPage 說明:調(diào)用方法就是屬性值是一個(gè)函數(shù),因此要注意this問題。要將this指向原來的位置。 展示? 說明:點(diǎn)擊上傳頁面展示,在這里我點(diǎn)擊了兩次?! ? 1.2.2uploadPreview 說明:需要學(xué)習(xí)Array.map方法的使用。 ?展示 說明:點(diǎn)擊圖片后全屏顯示? 1.2.3deleteImage按

    2024年02月06日
    瀏覽(363)
  • 微信小程序?qū)崿F(xiàn)圖片上傳(清晰版)

    在wxml文件中添加一個(gè)按鈕和一個(gè)image標(biāo)簽用于顯示上傳的圖片 在js文件中添加選擇圖片和上傳圖片的方法

    2023年04月16日
    瀏覽(89)
  • 微信小程序 圖片上傳與內(nèi)容安全審核

    微信小程序 圖片上傳與內(nèi)容安全審核

    之前有開發(fā)一個(gè)微信小程序,擁有圖片上傳的功能,上線運(yùn)行后一直表現(xiàn)良好,用戶漸漸增多。 但突然有一天,收到一個(gè)系統(tǒng)消息:提示我小程序存在內(nèi)容安全風(fēng)險(xiǎn),缺乏對不法違規(guī)內(nèi)容的過濾機(jī)制,需要整改,消息如下圖: 該消息是安全風(fēng)險(xiǎn)警告,需要限期內(nèi)進(jìn)行整改調(diào)

    2024年01月16日
    瀏覽(83)
  • 微信小程序?qū)ι蟼鞯膱D片進(jìn)行裁剪

    背景: 使用uniapp中uni.chooseImage的裁剪參數(shù)crop只能在App中生效,在微信小程序中不生效。 實(shí)現(xiàn)思路 uni.chooseImage 打開相冊獲取圖片路徑(uni.chooseImage(OBJECT) | uni-app官網(wǎng) (dcloud.net.cn)) 將獲取到的圖片路徑傳入 wx.cropImage 對圖片進(jìn)行裁剪(wx.cropImage(Object object) | 微信開放文檔 (q

    2024年02月04日
    瀏覽(21)
  • 微信小程序上傳文件及圖片(可以預(yù)覽)

    最近在寫小程序項(xiàng)目,碰到了一個(gè)需求,需要用戶可以上傳各種類型的文件和圖片,展示在頁面上,并且點(diǎn)擊還可以進(jìn)行預(yù)覽,就找了找微信小程序官網(wǎng),寫了一個(gè)例子,分享一下 直接看代碼: wxml: wxss: js: 有問題和建議歡迎大家留言

    2024年02月12日
    瀏覽(93)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包