微信小程序原生上传图片封装

该博客介绍了如何在微信小程序中封装一个图片上传组件,包括组件的属性、方法及使用场景。组件支持自定义上传图片数量、显示已上传图片、删除图片、预览图片等功能,并提供了详细的使用示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

资源参考

组件免费下载地址

概述

微信小程序原生上传图片功能封装,具体使用根据个人情况而定。

组件自定义属性与方法描述

  • isShow:布尔值,默认为true true:不显示上传图标 false:显示上传图标
  • count:Number类型,上传图片张数,总计默认最多9张
  • showUrl: Array类型,组件绑定值(后台返回已上传图片数据)
  • uploadUrl: String类型,上传图片的后台接口
  • bindmyevent:function类型,自定义事件

适用场景

  • 微信小程序原生组件
  • 微信小程序授权校验之后,进行拍照
  • 可以统计本次上传图片的失败次数
  • 样式根据自己需要自行调整
  • 图片可删除
  • 图片可预览

使用方式介绍

// 父组件  js文件
Page({
  data: {
    formData: {
      imgUrl: []
    },
    countPic: 9, //上传图片最大数量
    showImgUrl: "", //路径拼接,一般上传返回的都是文件名,
    uploadImgUrl: '/wechatApp/fireEye/imageUpload'
  },
  //监听组件事件,返回的结果
  myEventListener: function (e) {
    let currLabel = `formData.imgUrl`
    let currArray = e.detail
    this.setData({
      [currLabel]: currArray
    })
  }
  })
// 父组件 wxml
<view class="form-item">\
	<view class="item-label">隐患照片:</view>
	<uploadImages style="flex:1" bindmyevent="myEventListener" count='{{countPic}}' showUrl="{{formData.imgUrl}}"  uploadUrl="{{uploadImgUrl}}"></uploadImages>
</view>
// 父组件 json 组件引入
{
  "usingComponents": {
    "uploadImages": "/pages/components/uploadImages",
  }
}
// 图片上传组件  js文件
// component/uploadImages/index.js
import ipConfig from '../../../utils/ipConfig'
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    count: { //最多选择图片的张数,默认9张
      type: Number,
      value: 9
    },
    uploadUrl: { //图片上传的服务器路径
      type: String,
      value: ''
    },
    isShow: {// 隐藏上传按钮
      type: Boolean
    },
    showUrl: { //上传图片对象
      type: Array,
      value: [],
      observer: function (newVal) {
        if (newVal == null) return;
        this.setData({
          detailPics:JSON.parse(JSON.stringify(newVal))
        })
      }
    }
  },
  /**
   * 组件的初始数据
   */
  data: {
    detailPics: [], //上传的结果图片集合
    isTakePhoto: false,
    timer: null,
    isFault: 0, // 记录上传图片失败个数
    currRequestNum: 0, // 记录本次调用接口次数
    currSelectPicNum: 0,// 记录本次选择上传图片个数
    currUrl: [], //记录本次上传图片地址集合
    baseUrl:ipConfig.baseUrl
  },
  /**
   * 组件的方法列表
   */
  methods: {
    // 删除图片
    deletePic(e){
      let that = this
      let currPic = this.data.detailPics
      currPic.splice(e.currentTarget.dataset.index,1)
      that.setData({
        detailPics:currPic
      })
      that.triggerEvent('myevent', that.data.detailPics)//结果返回调用的页面
    },
    // 图片预览
    previewImage(e) {
      let array = []
      this.data.detailPics.forEach(item => {
        array.push(this.data.baseUrl+item)
      })
      wx.previewImage({
        current:array[e.currentTarget.dataset.id],
        urls: array,
      })
    },
    uploadDetailImage: function (e) { //这里是选取图片的方法
      var that = this;
      // 每次点击 重置本次选择上传图片个数、本次发起请求个数、本次上传图片故障数量
      that.setData({
        currSelectPicNum: 0,
        currRequestNum: 0,
        isFault: 0,
        currUrl:[]
      })
      //权限判断
      wx.getSetting({
        success(res) {
          if (!res.authSetting['scope.camera']) {
            wx.authorize({
              scope: 'scope.camera',
              success() {
                //直接打开摄像头
                if (!that.data.isTakePhoto) {
                  that.getTakePhoto()
                }
              },
              fail(err) {
                wx.showModal({
                  title: '提示',
                  content: '摄像头开启失败!!!',
                  cancelText: '退出',
                  confirmText: '去开启',
                  success(res) {
                    if (res.confirm) {
                      // 开启
                      wx.openSetting()
                    } else if (res.cancel) {
                      wx.navigateBack({
                        delta: -1,
                      })
                    }
                  }
                })
              }
            })
          } else {
            // 直接打开摄像头
            if (!that.data.isTakePhoto) {
              that.getTakePhoto()
            }
          }
        }
      })

    },
    getTakePhoto() {
      let that = this
      if (that.data.count == that.data.detailPics.length) {
        wx.showToast({
          title: '至多上传' + that.data.count + '张图片',
          mask: true,
          duration: 500,
          icon:'error'
        })
        return false
      }
      wx.chooseImage({
        count: that.data.count-that.data.detailPics.length, // 最多可以选择的图片张数,默认9
        sizeType: ['original', 'compressed'], // original 原图,compressed 压缩图,默认二者都有
        sourceType: ['album', 'camera'], // album 从相册选图,camera 使用相机,默认二者都有
        success: function (res) {
          var imgs = res?.tempFilePaths || [];
          that.setData({
            currSelectPicNum:imgs.length
          })
          wx.showLoading({
            title: '上传中...',
            mask: true,
            icon:'loading'
          })
          imgs?.forEach(item => {
            that.uploadimg({
              url: ipConfig.baseUrl + that.data.uploadUrl, //这里是你图片上传的接口
              path: item, //这里是选取的图片的地址数组
              header: {
                'content-type': 'application/x-www-form-urlencoded',
                'wx-token': wx.getStorageSync('Swrh_token'),
                "openId": wx.getStorageSync('Swrh_key').openId
              }
            });
          })
         
        },
      })
    },
    //多张图片上传
    uploadimg: function (data) {
      var that = this
      wx.uploadFile({
        url: data.url,
        filePath: data.path,
        name: 'file',
        header: data.header,
        formData: {},
        success: (resp) => {
          var picUrl = JSON.parse(resp?.data || '{}') //返回的结果,可能不同项目结果不一样
          if(picUrl.code===0){  //上传图片成功
            let currUrl = picUrl?.url || ''
            that.data.currUrl.push(currUrl)
            that.setData({
              currUrl:that.data.currUrl,
              currRequestNum:that.data.currRequestNum+1
            })
          }else{
            that.setData({
              isFault: this.data.isFault + 1,
              currRequestNum:that.data.currRequestNum+1
            })
          }
          
        },
        fail: (res) => {
          that.setData({
            isFault: this.data.isFault + 1,
            currRequestNum:that.data.currRequestNum+1
          })
        },
        complete: () => {
          if (that.data.currRequestNum === that.data.currSelectPicNum) {
            wx.hideLoading();
            if (that.data.isFault>0) {
              wx.showModal({
                title: '温馨提示',
                content: '检测到有' + that.data.isFault + '张图片上传失败,可能需要您重新上传',
                showCancel: false,
                confirmText:'我知道了'
              })
            }else{
              wx.showToast({
                title: '图片上传成功',
                mask:true,
                icon:'success'
              })
            }
            let currArray = that.data.currUrl.concat(that.data.detailPics)
            console.log(currArray)
            that.setData({
              detailPics:currArray
            })
            that.triggerEvent('myevent', that.data.detailPics)//结果返回调用的页面
          }
        }
      });
    },

  }
})

<think>好的,用户想知道如何在微信小程序封装原生的Request方法以及进行环境配置。首先,我需要回忆一下相关的知识。根据引用[1],封装Request方法可以简化HTTP请求,提高代码复用。引用[3]提到二次封装API的经验,比如Toast和Loading,这可能对封装Request有帮助。环境配置方面,引用[4]讨论了开发环境和生产环境的配置步骤,这应该是关键点。 首先,封装Request方法。用户需要创建一个util.js文件,如引用[1]所述,然后导出封装的request函数。这个函数需要处理请求参数,添加公共配置如URL前缀、超时时间,还要处理请求头。可能需要根据环境变量切换不同的基础URL,这里涉及环境配置。 接着,环境配置部分。根据引用[4],可以通过不同的配置文件来管理环境变量。比如创建config.dev.js和config.prod.js,然后在app.js中动态引入。这样在开发和生产环境切换时,只需修改引入的配置文件即可,无需更改代码。 然后,考虑加入拦截器功能,比如请求前后的处理,如显示Loading和Toast,引用[3]中的FN模块可能有类似实现。此外,错误处理也很重要,比如网络错误、超时、服务器错误等,需要统一处理并提示用户。 最后,生成相关问题。用户可能想了解如何优化封装的方法,或者如何处理跨域问题,以及如何测试不同环境。确保问题覆盖常见的使用场景和潜在问题。 需要检查步骤是否清晰,代码示例是否正确,是否符合微信小程序的API规范。同时,确保环境配置的方法可行,比如使用全局变量或在app.js中设置。可能还需要提及版本管理工具或构建流程来自动切换环境,但根据引用[4],简单的条件判断可能足够。 总结步骤:创建util.js封装request,处理参数和配置;通过配置文件区分环境;在app.js中动态加载配置;添加拦截器和错误处理;提供使用示例。相关问题围绕优化、跨域、测试和扩展功能展开。</think>### 微信小程序封装原生Request方法及环境配置教程 #### 一、封装原生Request方法 1. **创建公共请求工具文件** 在项目根目录新建`utils/request.js`,编写以下代码: ```javascript const request = (url, method, data, header = {}) => { const baseURL = getApp().globalData.config.baseURL; // 从全局配置获取环境变量[^4] const token = wx.getStorageSync('token'); // 示例:添加鉴权信息 return new Promise((resolve, reject) => { wx.request({ url: baseURL + url, method: method, data: data, header: { 'Content-Type': 'application/json', 'Authorization': token ? `Bearer ${token}` : '', ...header }, success: (res) => { if (res.statusCode === 200) { resolve(res.data); } else { reject(res.data); } }, fail: (err) => { wx.showToast({ title: '网络请求失败', icon: 'none' }); reject(err); } }); }); }; export default request; ``` 2. **添加拦截器功能** 在请求前后添加全局Loading提示(参考引用[3]): ```javascript // 在request函数中添加 wx.showLoading({ title: '加载中' }); wx.hideLoading(); // 在success/fail的finally中调用 ``` --- #### 二、环境配置实现 1. **创建环境配置文件** - 开发环境:`config/dev.js` ```javascript module.exports = { baseURL: 'https://dev.api.com' }; ``` - 生产环境:`config/prod.js` ```javascript module.exports = { baseURL: 'https://api.com' }; ``` 2. **全局加载配置** 在`app.js`中动态加载配置: ```javascript const env = 'dev'; // 通过编译命令或IDE配置切换[^4] App({ globalData: { config: require(`./config/${env}.js`) } }); ``` --- #### 三、使用示例 ```javascript import request from '../../utils/request'; Page({ async getData() { try { const res = await request('/user', 'GET', { id: 1 }); console.log('响应数据:', res); } catch (error) { wx.showToast({ title: error.msg, icon: 'none' }); } } }); ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值