您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > 小程序

小程序中多图片上传

时间:2023-02-03 15:15:43  来源:今日头条  作者:市井游客

前言:

由于小程序中 wx.uploadFile 的方法是异步上传,不符合我们的需求,它自身目前暂时不支持同步上传,所以需要我们手动处理。因为通常我们在上传图片时,可能是多张图片上传,将图片上传后还需要同字段数据再一起保存,所以需要同步来保存处理。通俗易懂来讲就是:先图片上传返回图片集合数据,再执行下一步保存,总之图片上传的动作和下一步保存的动作不能出现顺序错误。先图片再下一步数据一同保存,这理解为同步处理,如果顺序不对,则理解为异步。

小程序page端:

<text class="word-class" style="font-size: 28rpx;">添加图片:</text>
<!--以下为图片选择-->
<view class="img_box">
  <view class="imgs" wx:for="{{tempFilePaths}}" wx:key="index">
    <image src='{{item}}' bindlongpress="DeleteImg" bindtap="PreviewImg" data-index="{{index}}" mode='widthFix' />
  </view>
  <view class="imgs">
    <view class="images" bindtap="ChooseImg">
      <!--这里自行创建image文件夹,并添加choose.png,及中部加号-->
      <image src='/static/images/add.png' mode='widthFix' />
    </view>
  </view>
</view>

小程序css

/* 选择图片 */
.img_box{
  width:690rpx;
  position:relative;
  display: flex;
  flex-wrap: wrap;
  margin:0 auto;
  padding-top: 20px;
}

.imgs{
  width:33.33333333%;
  display: flex;
  justify-content: center;
  margin-bottom:20rpx;
}

.imgs image{
  width:90%;
  max-height:212rpx;
  border:1px solid rgba(214, 212, 212, 0.1);
}

.imgs .images{
  position:relative;
}

.images button{
  width:100%;
  height:100%;
  position:absolute;
  top:0;
  left:0;
}

.img_box .images{
  width:90%;
  height: 212rpx;
  border:1px solid #E8E8E8;
  border-radius:4rpx;
  display: flex;
  align-items: center;
  justify-content: center;
}

.img_box .images>image{
  width:60rpx;
  height:60rpx;
}

小程序JS端:

let App = getApp();
// 工具类
let util = require('../../util/util')
// 接口地址
let api = require('../../config/api.js')
// 当前js的工具类
let custom = require('../../util/custom')
Page({
  data: {
    tempFilePaths: [],
    temp: [], // 多图片缓存区
  },
  ChooseImg() {
    let that = this;
    wx.chooseImage({
      count: 9, // 默认最多9张图片,可自行更改
      sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
      sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
      success: res => {
        wx.showToast({
          title: '正在添加...',
          icon: 'loading',
          mask: true,
          duration: 1000
        })

        let fullName = res.tempFilePaths + "";
        let last = fullName.lastIndexOf(".");
        let suffix = fullName.substring(last + 1, fullName.length);
        // 只有图片才可以上传
        if (suffix == 'jpg' || suffix == 'png' || suffix == 'jpeg' || suffix == 'bmp') {
          that.data.temp.push(res.tempFilePaths + "");
        } else {
          wx.showModal({
            title: '提示',
            content: '图片上传错误',
            success: function (res) {
              if (res.confirm) {
                console.log('用户点击确定')
              } else {
                console.log('用户点击取消')
              }
            }
          });
        }
        let imgs = that.data.temp;
        that.setData({
          tempFilePaths: imgs
        })
        console.log(that.data.tempFilePaths)
      }
    })
  },
  //预览图片
  PreviewImg: function (e) {
    let index = e.target.dataset.index;
    let that = this;
    wx.previewImage({
      current: that.data.tempFilePaths[index],
      urls: that.data.tempFilePaths,
    })
  },
  //长按删除图片
  DeleteImg: function (e) {
    var that = this;
    var tempFilePaths = that.data.tempFilePaths;
    let temp = that.data.temp;
    var index = e.currentTarget.dataset.index;//获取当前长按图片下标
    wx.showModal({
      title: '提示',
      content: '确定要删除此图片吗?',
      success: function (res) {
        if (res.confirm) {
          //console.log('点击确定了');
          tempFilePaths.splice(index, 1);
          temp.splice(index, 1);
        } else if (res.cancel) {
          //console.log('点击取消了');
          return false;
        }
        that.setData({
          tempFilePaths
        });
      }
    })
  },
  onLoad: function (options) {

  },
  onReady: function () {

  },
  cancelWork() {
    wx.navigateBack();
  },
  async saveWrok() {
    
    let that = this;
    var tempFilePaths = that.data.tempFilePaths;
    // 同步等待
    awAIt custom.uploadImage(tempFilePaths).then(res => {
      return Promise.resolve(res)
    }).then(res => {
      // 同步等待返回的图片地址集合
      let files = res;
      let param = {
        fild1:xxx, // 字段1
        filed2:xxx, // 字段2
        files: files, // 图片地址集合
      }
      // 将图片地址和字段一起保存
      util.http('https://xxx.cn/save', param,'GET').then(function (res) {
        if (res.code == 0) {
          // 判断图片
          // console.log("size:" + that.data.files.length)
          if (that.data.tempFilePaths.length < 1) {
            that.data.temp = [];
            that.data.tempFilePaths = [];
            wx.showModal({
              title: '提示',
              content: '图片上传错误',
              success: function (res) {
                if (res.confirm) {
                  console.log('用户点击确定')
                } else {
                  console.log('用户点击取消')
                }
              }
            });

            that.setData({
              tempFilePaths: [],
              temp: [],
            });
            return false;
          }
          util.showToast(res.data)
          wx.navigateBack();
        }
      });
    });

  },

  onShow: function () {
    // 页面显示

  },
  onHide: function () {
    // 页面隐藏

  },
  onUnload: function () {
    // 页面关闭

  },

})

图片工具类 custom.js

// 工具类
let util = require('../util/util')
// 地址接口
let api = require('../config/api')

/**
 * 真正上传方法
 * @param {图片上传接口} imgPath 
 * @param {图片文件资源地址} filePath 
 */
function uploadList(imgPath, filePath) {
  return new Promise((resolve, reject) => {
    wx.uploadFile({
      url: imgPath,
      filePath: filePath + "", //获取图片路径
      header: {
        'content-type': 'multipart/form-data'
      },
      name: 'file',
      success: function (res) {
        if (res.statusCode == 200) {
          resolve(res.data)
        } else {
          reject(err, res);
        }
      },
      fail: function (err) {
        reject(err, res);
      }
    });
  });
}

/**
 * 图片上传,多图片上传,同步处理一并返回-虚拟文件地址的list
 * @param {本地文件list} tempFilePaths 
 */
async function uploadImage(tempFilePaths = []) {
  let fileList = new Array();
  for (let i = 0; i < tempFilePaths.length; i++) {
    let data = await uploadList(api.workUpload, tempFilePaths[i]);
    // 进行设置返回
    let rt = JSON.parse(data);
    // 由于之前封装的request方法为application/json类型,所以这里需要特殊处理返回的数据格式
    let url = (rt.url).replaceAll('"','');
    fileList.push(url);
  }
  return fileList;
}

module.exports = {
  orderWork, // list
  uploadImage, // 多张图片上传
}


Tags:小程序   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
京东小程序数据中心架构设计与最佳实践
一、京东小程序是什么京东小程序平台能够提供开放、安全的产品,成为品牌开发者链接京东内部核心产品的桥梁,致力于服务每一个信任我们的外部开发者,为不同开发能力的品牌商家提...【详细内容】
2024-03-27  Search: 小程序  点击:(19)  评论:(0)  加入收藏
我们一起解锁小程序开发新姿势
如今,鸿蒙开发日益受到广大开发者的关注,而小程序开发也早已成为互联网领域的热门话题。那么,我们不禁要问:是否有可能将这两者融为一体,将小程序开发的便捷与高效带入鸿蒙生态中...【详细内容】
2024-03-20  Search: 小程序  点击:(20)  评论:(0)  加入收藏
2024年微信小程序分账全攻略:对接流程详解,轻松实现资金分配
在微信小程序运营中,分账功能对于实现多方收益分配、优化资金流转至关重要。那么,微信小程序如何分账?又有哪些对接流程呢?跟着小编去看看吧!一、微信小程序分账概述微信小程序分...【详细内容】
2024-03-15  Search: 小程序  点击:(19)  评论:(0)  加入收藏
微信宣布规范“公众号文章诱骗点击小程序,骗取广告收益”行为
IT之家 3 月 14 日消息,微信公众平台运营中心今日发文称,平台近期发现部分创作者在文章中使用不完全或擦边的标题、擦边的封面和无意义或不完整的内容,并插入诱导性小程序卡片...【详细内容】
2024-03-15  Search: 小程序  点击:(18)  评论:(0)  加入收藏
抖音加大对短剧小程序推荐力度
新腕儿联合鞭牛士报道,2月26日消息,短剧近期数据平稳且持续发展,抖音加强了对短剧抖音小程序的推荐力度。以碧海剧场小程序为例,抖音短剧小程序向用户申请更多「通知信息」权限...【详细内容】
2024-02-26  Search: 小程序  点击:(40)  评论:(0)  加入收藏
一段微信小程序前端与后端连接的代码,带注解
微信小程序的前端和后端连接通常涉及到使用微信小程序提供的网络请求API与后端服务器进行通信。以下是一个简单的示例,展示如何使用微信小程序的前端代码向后端发送请求并处...【详细内容】
2024-01-24  Search: 小程序  点击:(58)  评论:(0)  加入收藏
小程序必须要安装部署SSL证书吗?
自2017年9月21日,微信发布一则《关于公众平台接口不再支持HTTP方式调用的公告》。明确表示,为保证数据传输安全,提高业务安全性,公众平台不再支持HTTP方式调用。应避免影响正常...【详细内容】
2024-01-02  Search: 小程序  点击:(74)  评论:(0)  加入收藏
一文了解什么是微信小程序
如果您无需下载和管理即可获得像原生 iOS 或 Android APP 一样流畅的体验会怎样?腾讯通过微信小程序实现了这一替代方案。一、什么是微信小程序?它们与原生应用程序和 H5 迷你...【详细内容】
2023-12-26  Search: 小程序  点击:(97)  评论:(0)  加入收藏
微信商户号怎么开通?教你申请0.2%费率商户码对接小程序公众号
随着移动互联网的快速发展,电子支付方式已经深入到人们的生活中,而微信支付作为中国领先的移动支付平台,在无数的应用场景中发挥着重要作用。这里先免费分享一个0.2费率的商户...【详细内容】
2023-12-16  Search: 小程序  点击:(64)  评论:(0)  加入收藏
小程序开发需要多少钱?小程序开发的真实成本:报价案例、费用价格表与开发周期解析
分享一个上海客户的微信小程序定制开发的需求,销售课程与相关商品。项目分为后台管理系统和小程序前端,功能不是太复杂,周期大概1个月,费用3万。大家可能比较关心几个地方,比如一...【详细内容】
2023-12-11  Search: 小程序  点击:(119)  评论:(0)  加入收藏
▌简易百科推荐
京东小程序数据中心架构设计与最佳实践
一、京东小程序是什么京东小程序平台能够提供开放、安全的产品,成为品牌开发者链接京东内部核心产品的桥梁,致力于服务每一个信任我们的外部开发者,为不同开发能力的品牌商家提...【详细内容】
2024-03-27  dbaplus社群    Tags:小程序   点击:(19)  评论:(0)  加入收藏
我们一起解锁小程序开发新姿势
如今,鸿蒙开发日益受到广大开发者的关注,而小程序开发也早已成为互联网领域的热门话题。那么,我们不禁要问:是否有可能将这两者融为一体,将小程序开发的便捷与高效带入鸿蒙生态中...【详细内容】
2024-03-20  前端充电宝  微信公众号  Tags:小程序   点击:(20)  评论:(0)  加入收藏
一段微信小程序前端与后端连接的代码,带注解
微信小程序的前端和后端连接通常涉及到使用微信小程序提供的网络请求API与后端服务器进行通信。以下是一个简单的示例,展示如何使用微信小程序的前端代码向后端发送请求并处...【详细内容】
2024-01-24    简易百科  Tags:代码   点击:(58)  评论:(0)  加入收藏
小程序必须要安装部署SSL证书吗?
自2017年9月21日,微信发布一则《关于公众平台接口不再支持HTTP方式调用的公告》。明确表示,为保证数据传输安全,提高业务安全性,公众平台不再支持HTTP方式调用。应避免影响正常...【详细内容】
2024-01-02  云诏    Tags:小程序   点击:(74)  评论:(0)  加入收藏
一文了解什么是微信小程序
如果您无需下载和管理即可获得像原生 iOS 或 Android APP 一样流畅的体验会怎样?腾讯通过微信小程序实现了这一替代方案。一、什么是微信小程序?它们与原生应用程序和 H5 迷你...【详细内容】
2023-12-26  小文智能    Tags:微信小程序   点击:(97)  评论:(0)  加入收藏
小程序开发需要多少钱?小程序开发的真实成本:报价案例、费用价格表与开发周期解析
分享一个上海客户的微信小程序定制开发的需求,销售课程与相关商品。项目分为后台管理系统和小程序前端,功能不是太复杂,周期大概1个月,费用3万。大家可能比较关心几个地方,比如一...【详细内容】
2023-12-11  久码小程序开发  今日头条  Tags:小程序   点击:(119)  评论:(0)  加入收藏
小程序技术分享:安全机制与运行机制
小程序凭借其高曝光率、开发成本低、运行更流畅等优势和特点,一经推出就被广泛使用,面对小程序的火爆,自然而然地,就有很多开发者转战小程序领域,本文主要带大家了解下小程序运行...【详细内容】
2023-12-07  前端实习生Findan    Tags:小程序   点击:(140)  评论:(0)  加入收藏
微信小程序的编译原理
2021年来,随着科技的进步,人们的生活水平也在不断提高。现在,微信小程序已经成为了现代人生活中不可或缺的一部分,它可以帮助我们更方便地查找信息,购物,预订机票和酒店,进行社交等...【详细内容】
2023-12-06  前端实习生Findan    Tags:小程序   点击:(132)  评论:(0)  加入收藏
模板小程序和订制开发小程序的区别?
相比外卖APP,外卖小程序是不用下载到手机的,所以对于用户来说更方便一点。简单方便的程序用户才更愿意使用。现在不少商家越来越重视外卖小程序开发,想通过外卖小程序冲进这片...【详细内容】
2023-11-24  重庆洺宸传媒    Tags:小程序   点击:(236)  评论:(0)  加入收藏
一分钟学会用宝塔面板搭建小程序
宝塔面板搭建小程序怎样用?想要使用宝塔面板搭建小程序?这里是实用教程,帮助您快速上手。在本教程中,我们将扼要了解宝塔面板的基础知识,并一步步演示怎么搭建一个小程序。第一步...【详细内容】
2023-11-15    网络  Tags:小程序   点击:(196)  评论:(0)  加入收藏
站内最新
站内热门
站内头条