Uploader 文件上传

引入

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

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

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

代码演示

基础用法

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

  1. <van-uploader file-list="{{ fileList }}" bind:after-read="afterRead" />
  1. Page({
  2. data: {
  3. fileList: []
  4. },
  5. methods: {
  6. afterRead(event) {
  7. const { file } = event.detail;
  8. // 当设置 mutiple 为 true 时, file 为数组格式,否则为对象格式
  9. wx.uploadFile({
  10. url: 'https://example.weixin.qq.com/upload', // 仅为示例,非真实的接口地址
  11. filePath: file.path,
  12. name: 'file',
  13. formData: { user: 'test' },
  14. success(res) {
  15. // 上传完成需要更新 fileList
  16. const { fileList = [] } = this.data;
  17. fileList.push({ ...file, url: res.data });
  18. this.setData({ fileList });
  19. }
  20. });
  21. }
  22. }
  23. });

图片预览

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

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

限制上传数量

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

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

自定义上传样式

通过插槽可以自定义上传区域的样式

  1. <van-uploader>
  2. <van-button icon="photo" type="primary">上传图片</van-button>
  3. </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 videostringimage-
sizeType所选的图片的尺寸, 当acceptimage类型时设置所选图片的尺寸可选值为original compressedstring[]['original','compressed']-
preview-size预览图和上传区域的尺寸,默认单位为pxstring | number80px-
preview-image是否在上传完成后展示预览图booleantrue-
preview-full-image是否在点击预览图后展示全屏图片预览booleantrue-
multiple是否开启图片多选,部分安卓机型不支持booleanfalse-
disabled是否禁用文件上传booleanfalse-
deletable是否展示删除按钮booleantrue-
capture图片或者视频选取模式,当acceptimage类型时设置capture可选值为camera可以直接调起摄像头string | string[]['album', 'camera']-
disabled是否禁用文件上传booleanfalse-
max-size文件大小限制,单位为bytenumber--
max-count文件上传数量限制number--
upload-text上传区域文字提示string--
image-fit预览图裁剪模式,可选值参考小程序image组件的mode属性stringscaleToFill-
use-before-read是否开启文件读取前事件boolean--
camera当 accept 为 video 时生效,可选值为 back frontstring--
compressed当 accept 为 video 时生效,是否压缩视频,默认为trueboolean--
max-duration当 accept 为 video 时生效,拍摄视频最长拍摄时间,单位秒number--

Slot

名称说明
-自定义上传区域

Event

事件名说明回调参数
bind:before-read文件读取前,在回调函数中返回 false 可终止文件读取,绑定事件的同时需要将use-before-read属性设置为trueevent.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: 删除图片的序号值

Uploader 文件上传 - 图1