小程序图片上传组件

功能介绍

  1. 点击添加图片框, 选择并添加图片

  2. 点击关闭小图标, 删除已选图片

  3. 可能过传参控制最多上传几张图片

组件封装介绍
  1. 在与pages同级位置新建components文件夹, 用于存放项目中常用的组件

  2. 在coponents文件夹里边新建uploadPic文件夹, 来放置我们的组件内容

uploadPic.wxml文件代码

  <view class="pic-array">
    <view class="item-pic" wx:for="{{files}}" wx:key="index">
      <image src="{{uploadPath}}{{item}}" class="pic"></image>
      <image src="/static/images/close-white.png" class="icon" bindtap="deletePic" data-index="{{index}}"></image>
    </view>
    <view class="item-pic">
    <image src="/static/images/upload.png" class="pic" bindtap="uploadPic"></image>
    </view>
  </view>

uploadPic.wxss文件代码

.pic - array {
  display: flex;
  flex - wrap: wrap;
}

.item - pic {
  position: relative;
  margin: 0 10 rpx 10 rpx 0;
}

.item - pic.pic {
  width: 160 rpx;
  height: 160 rpx;
  display: block;
}

.item - pic.icon {
  position: absolute;
  right: 10 rpx;
  top: 10 rpx;
  width: 28 rpx;
  height: 28 rpx;
}

uploadPic.json文件代码

{
  "component": true //设置该页面为组件,一定要加上这句代码,注意json文件中不能写注释
}

uploadPic.js文件代码

var common = require('../../utils/common.js');
var util = require('../../utils/util.js');
  Component({
  properties: {
    files: {
      type: Array,
      value: []
    },
    maxFileCount: { //允许最多9张图片
      type: Number,
      value: 9
    },
    isCanAddFile: {
      type: Boolean,
      value: true
    }
 },

  data: {
    uploadPath: util.uploadPath
  },

  methods: {
  // 图片上传
    uploadPic() {
      var that = this;
      wx.chooseImage({
        count: that.data.maxFileCount - that.data.files.length, //最多可以选择的图片张数
        sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
        sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
        success(res) {
          var waitFiles = res.tempFilePaths;
          var allowCount = that.data.maxFileCount - that.data.files.length; //允许上传的文件数
          if (waitFiles.length >= allowCount) {
            waitFiles = waitFiles.slice(0, allowCount);
          }
          var index = 0; //第几张开始
          var successFiles = []; //成功的文件
          common.uploadFiles(waitFiles, index, successFiles, function (urls) { //此处为抽出的公用方法,便于其它地方调用
          console.log(urls);
          that.data.files = that.data.files.concat(urls);
          if (that.data.files.length >= that.data.maxFileCount) {
            that.data.isCanAddFile = false;
          }
          that.setData({
            files: that.data.files,
            isCanAddFile: that.data.isCanAddFile
          });
        })
      }
    },
  // 图片删除
  deletePic(e) {
    var that = this;
    var files = that.data.files;
    var index = e.currentTarget.dataset.index; //获取当前长按图片下标
    wx.showModal({
      title: '提示',
      content: '确定要删除此图片吗?',
      success: function (res) {
        if (res.confirm) {
          files.splice(index, 1);
        } else if (res.cancel) {
          return false;
        }
        that.setData({
          files,
          isCanAddFile: true
        });
      }
    })
  },
  //将文件路径暴露出去
  getFiles: function () {
    return this.data.files;
  }
}
})

common.js中上传图片的公共方法

  • 采用递归的方式多文件上传

  • imgPaths:需要上传的文件列表

  • index:imgPaths开始上传的序号

  • successFiles:已上传成功的文件

  • callBack:文件上传后的回调函数

function uploadFiles(imgPaths, index, successFiles, callBack) {
var that = this;
wx.showLoading({
  title: '正在上传第' + index + '张',
})
wx.uploadFile({
  url: "文件上传地址",
  filePath: imgPaths[index],
  name: 'anqindayviews',
  header: {
    "Content-Type": "multipart/form-data"
  },
  success: function (res) {
    console.log(res);
    var data = JSON.parse(res.data);
    //成功,文件返回值存入成功列表
    if (data.error === '0') {
      successFiles.push(data.result);
    }
  },
  complete: function (e) {
    index++; //下一张
    if (index == imgPaths.length) {
      wx.hideLoading();
      //上传完毕,作一下提示
      wx.showToast({
        title: '上传成功' + successFiles.length,
        icon: 'success',
        duration: 2000
      });
      if (callBack) {
        callBack(successFiles);
      }
    } else {
      //递归调用,上传下一张
      that.uploadFiles(imgPaths, index, successFiles, callBack);
    }
  }
})
}

组件的引用

wxml文件

<uploadPic id = "uploadPic" > < /uploadPic>

json文件

{
"usingComponents": {
  "uploadPic": "../../components/uploadPic/uploadPic"
}
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271