2019-12-05 13:08:01 +08:00

6.2 KiB

Uploader 文件上传

引入

app.jsonindex.json中引入组件,默认为ES6版本,ES5引入方式参见快速上手

"usingComponents": {
  "van-uploader": "path/to/@vant/weapp/dist/uploader/index"
}

Vant Weapp 1.0 版本开始支持此组件,升级方式参见快速上手

代码演示

基础用法

文件上传完毕后会触发after-read回调函数,获取到对应的文件的临时地址,然后再使用wx.uploadFile将图片上传到远程服务器上

<van-uploader file-list="{{ fileList }}" bind:after-read="afterRead" />
Page({
  data: {
    fileList: []
  },
  methods: {
    afterRead(event) {
      const { file } = event.detail;
      // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
      wx.uploadFile({
        url: 'https://example.weixin.qq.com/upload', // 仅为示例,非真实的接口地址
        filePath: file.path,
        name: 'file',
        formData: { user: 'test' },
        success(res) {
          // 上传完成需要更新 fileList
          const { fileList = [] } = this.data;
          fileList.push({ ...file, url: res.data });
          this.setData({ fileList });
        }
      });
    }
  }
});

图片预览

通过向组件传入file-list属性,可以绑定已经上传的图片列表,并展示图片列表的预览图

<van-uploader file-list="{{ fileList }}" />
Page({
  data: {
    fileList: [
      { url: 'https://img.yzcdn.cn/vant/leaf.jpg', name: '图片1' },
      // Uploader 根据文件后缀来判断是否为图片文件
      // 如果图片 URL 中不包含类型信息,可以添加 isImage 标记来声明
      {
        url: 'http://iph.href.lu/60x60?text=default',
        name: '图片2',
        isImage: true
      }
    ]
  }
});

限制上传数量

通过max-count属性可以限制上传文件的数量,上传数量达到限制后,会自动隐藏上传区域

<van-uploader
  file-list="{{ fileList }}"
  max-count="2"
  bind:after-read="afterRead"
/>

自定义上传样式

use-slot属性设置为true,通过插槽可以自定义上传区域的样式

<van-uploader use-slot>
  <van-button icon="photo" type="primary">上传图片</van-button>
</van-uploader>

上传前校验

use-before-read属性设置为true,然后绑定 before-read 事件可以在上传前进行校验,调用 callback 方法传入 true 表示校验通过,传入 false 表示校验失败。

<van-uploader
  file-list="{{ fileList }}"
  use-before-read
  bind:before-read="beforeRead"
  bind:after-read="afterRead"
/>
Page({
  data: {
    fileList: []
  },

  methods: {
    beforeRead(event) {
      const { file, callback } = event.detail;
      callback(file.type === 'image');
    }
  }
});

云开发示例

上传图片至云存储

在开发中,可以利用小程序云开发的云存储能力,将图片上传至云存储内。然后根据返回的fileiId来下载图片、删除图片和替换临时链接。

// 上传图片
uploadToCloud() {
  wx.cloud.init();
  const { fileList } = this.data;
  if (!fileList.length) {
    wx.showToast({ title: '请选择图片', icon: 'none' });
  } else {
    const uploadTasks = fileList.map((file, index) => this.uploadFilePromise(`my-photo${index}.png`, file));
    Promise.all(uploadTasks)
      .then(data => {
        wx.showToast({ title: '上传成功', icon: 'none' });
        const newFileList = data.map(item => { url: item.fileID });
        this.setData({ cloudPath: data, fileList: newFileList });
      })
      .catch(e => {
        wx.showToast({ title: '上传失败', icon: 'none' });
        console.log(e);
      });
  }
}

uploadFilePromise(fileName, chooseResult) {
  return wx.cloud.uploadFile({
    cloudPath: fileName,
    filePath: chooseResult.path
  });
}

API

Props

参数 说明 类型 默认值 版本
name 标识符,可以在回调函数的第二项参数中获取 string | number - -
accept 接受的文件类型, 可选值为all image file string image -
preview-size 预览图和上传区域的尺寸,默认单位为px string | number 80px -
preview-image 是否在上传完成后展示预览图 boolean true -
preview-full-image 是否在点击预览图后展示全屏图片预览 boolean true -
multiple 是否开启图片多选,部分安卓机型不支持 boolean false -
disabled 是否禁用文件上传 boolean false -
deletable 是否展示删除按钮 boolean true -
capture 图片选取模式,当acceptimage类型时设置capture可选值为camera可以直接调起摄像头 string | string[] ['album', 'camera'] -
disabled 是否禁用文件上传 boolean false -
max-size 文件大小限制,单位为byte number - -
max-count 文件上传数量限制 number - -
upload-text 上传区域文字提示 string - -
image-fit 预览图裁剪模式,可选值参考小程序image组件的mode属性 string scaleToFill -

Slot

名称 说明
- 自定义上传样式

Event

事件名 说明 回调参数
bind:before-read 文件读取前的回调函数,返回 false 可终止文件读取,绑定事件的同时需要将use-before-read属性设置为true event.detail.file: 当前读取的文件,event.detail.callback: 回调函数,调用callback(false)终止文件读取
bind:after-read 文件读取完成后的回调函数 event.detail.file: 当前读取的文件
bind:oversize 文件超出大小限制的回调函数 -
bind:click-preview 点击预览图片的回调函数 event.detail.index: 点击图片的序号值
bind:delete 删除图片的回调函数 event.detail.index: 删除图片的序号值