微信小程序上传图片和文件


要有遥不可及的梦想,也要有脚踏实地的本事。----------- Grapefruit.Banuit Gang(香柚帮)


今天讲解一下微信小程序上传图片或者上传文件的步骤:

首先第一步我们要先在wxml页面文件中写入一个图标或者按钮,用来触发微信调起手机相册和拍照功能,供你选择图片

<image src="/static/images/addimg.png" bindtap="chooseImage"></image>

然后给这个图标或者按钮写上点击事件chooseImage(事件名称随意定义)

然后还需要写一个盒子,用来存放选择好的文件缩略图,缩略图上写上删除按钮,供删除,并且要实现点击缩略图展示大图的功能,下面是我写的整体内容

<view class="imgbox">
   <!-- 存放上传的图片的盒子 -->
   <block wx:for="{{images}}" wx:key="this">
      <view class="add">
         <!-- 图片缩略图  -->
         <image src="{{item}}" mode="aspectFill" data-idx="{{index}}" bindtap="handleImagePreview"></image>
         <!-- 移除图片的按钮  -->
         <view class="delete" data-idx="{{index}}" bindtap="removeImage">删除</view>
      </view>
   </block>
   <image src="/static/images/addimg.png" bindtap="chooseImage"></image>
</view>

images: 是用来存放选择图片的数组,js定义

handleImagePreview:查看大图的点击事件

removeImage:删除已选择的图片的点击事件

下面是样式文件,可自由调整

.imgbox{
  width: 100%;
  min-height: 70rpx;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  flex-wrap: wrap;
}
.imgbox image{
  width: 70rpx;
  height: 70rpx;
}
.add{
  display: flex;
  flex-direction: column;
  align-items: center;
  margin-right: 20rpx;
}
.delete{
  font-size: 24rpx;
  color: #E60000;
}

然后是js文件:

Page({
    /**
   * 页面的初始数据
   */
  data: {
    images: [],
  },
  //点击添加按钮选择图片
  chooseImage: function (e) {
    wx.chooseImage({
      sizeType: ['original', 'compressed'], //可选择原图或压缩后的图片
      sourceType: ['album', 'camera'], //可选择性开放访问相册、相机
      success: res => {
        const images = this.data.images.concat(res.tempFilePaths)
        this.setData({
          images: images
        })
      }
    })
  },
  // 删除图片
  removeImage(e) {
    const idx = e.target.dataset.idx;
    this.data.images.splice(idx, 1);
    var del_image = this.data.images;
    this.setData({
      images: del_image
    })
  },
  // 查看大图
  handleImagePreview(e) {
    const idx = e.target.dataset.idx
    const images = this.data.images
    wx.previewImage({
      current: images[idx], //当前预览的图片
      urls: images, //所有要预览的图片
    })
  },
})

到此是已经完成了图片选择,删除,预览的功能

最后是上传:

需要注意的是,上传图片的时候只能单张上传,因此当我们选择了多张图片之后,需要分开一张一张的上传,因此需要写一个for循环。

点击上传按钮进行操作:

    var that = this;
    let images = this.data.images
    let img = []
    if (images.length > 0) {
      for (var i = 0; i < images.length; i++) {
        wx.getImageInfo({
          src: images[i],
          success(res) {
            wx.uploadFile({
              url: api.Cg_TousuUpload + '?session_id=' + wx.getStorageSync('session_id'), //上传图片接口地址
              filePath: res.path,
              name: 'wxfiles',
              formData: null,
              timeout: 60000,
              formData: { 
                //这里面可以放一些后端要的其他参数
              },
              success: function (res) {
                if (JSON.parse(res.data).code == 'Y') {
                  //上传成功之后,后端会返回你图片的线上地址,名称和一个id
                  if (images.length == img.length) {
                    //相等说明已经上传完毕
                  }
                }
              },
              fail: function (error) {}
            })
          }
        })
      }
    }

这个是上传图片的步骤,上传附件跟上传图片大致类似,下面是上传附件的步骤

  // 文件上传
  chooseFile() {
    var that = this
    wx.chooseMessageFile({
      count: 1,
      type: 'file',
      success(res) {
        var file = 'voucherData.matterapply_file'
        const tempFilePaths = res.tempFiles
        that.setData({
          files: tempFilePaths
        })
      }
    })
  },
  // 删除文件
  removefile() {
    this.setData({
      files: []
    })
  },

我这里是只允许选择一张附件,如果要选择多个附件,参照图片功能即可,

还有就是wx.chooseMessageFile这个方法只允许选择微信里的文件,如果想上传手机里的文件,需要用微信发一下就能选到了

    var that = this;
    let files = that.data.files
    if (files.length > 0) {
        wx.uploadFile({
          url: api.Cg_TousuUpload + '?session_id=' + wx.getStorageSync('session_id'), //上传附件接口地址
          filePath: res.path,
          name: 'wxfiles',
          formData: null,
          timeout: 60000,
          formData: { 
             //这里面可以放一些后端要的其他参数
          },
          success: function (res) {
            if (JSON.parse(res.data).code == 'Y') {
              //上传成功之后,后端会返回你附件的线上地址,名称和一个id
            }
          },
          fail: function (error) {}
        })
    }

好了,就是这些,有问题咨询,希望能帮助到一些人吧!!!

  • 15
    点赞
  • 150
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Grapefruit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值