# mx-uploader 文件上传

用于将本地的图片或文件上传至服务器,并在上传过程中展示预览图和上传进度。目前 Uploader 组件不包含将文件上传至服务器的接口逻辑,该步骤需要自行实现。

# 引入

在app.json或index.json中引入组件,详细介绍见快速上手

"usingComponents": {
  "mx-uploader": "/miniprogram_npm/m-ui/mx-uploader/index"
}

# 小程序码

可使用微信扫码查看小程序码

#

# 代码演示

# 基本用法

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

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

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

# 图片预览

通过向组件传入file-list属性,可以绑定已经上传的图片列表,并展示图片列表的预览图。file-list 的详细结构可见下方。

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

# 图片可删除状态

通过deletable属性可控制是否开启所有图片的可删除状态,deletable默认为true,即所有图片都可删除。 若希望控制单张图片的可删除状态,可将deletable属性设置为true,并在fileList中为每一项设置deletable属性。

<mx-uploader file-list="{{ fileList }}" deletable="{{ true }}" />
Page({
  data: {
    fileList: [
      {
        url: 'https://img.yzcdn.cn/mxt/leaf.jpg',
      },
      {
        url: 'https://img.yzcdn.cn/mxt/tree.jpg',
        deletable: false,
      },
    ],
  },
});

# 上传状态

通过status属性可以标识上传状态,uploading表示上传中,failed表示上传失败,done表示上传完成。

<mx-uploader file-list="{{ fileList }}" />
Page({
  data: {
    fileList: [
      {
        url: 'https://img.yzcdn.cn/mxt/leaf.jpg',
        status: 'uploading',
        message: '上传中',
      },
      {
        url: 'https://img.yzcdn.cn/mxt/tree.jpg',
        status: 'failed',
        message: '上传失败',
      },
    ],
  },
});

# 限制上传数量

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

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

# 上传前校验

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

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

  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.url
  });
}

# API

# Props

参数 说明 类型 默认值
name 标识符,可以在回调函数的第二项参数中获取 string、number -
accept 接受的文件类型, 可选值为all media image file video string image
sizeType 所选的图片的尺寸, 当accept为image、 media 类型时设置所选图片的尺寸可选值为original compressed string[] ['original','compressed']
preview-size 预览图和上传区域的尺寸,默认单位为px string、number 80px
preview-image 是否在上传完成后展示预览图 boolean true
preview-full-image 是否在点击预览图后展示全屏图片预览 boolean true
multiple 是否开启图片多选,部分安卓机型不支持 boolean false
disabled 是否禁用文件上传 boolean false
show-upload 是否展示文件上传按钮 boolean true
deletable 是否展示删除按钮 boolean true
capture 图片或者视频选取模式,当accept为image 、 media 类型时设置capture可选值为camera可以直接调起摄像头 string[] ['album', 'camera']
max-size 文件大小限制,单位为byte number -
max-count 文件上传数量限制 number -
upload-text 上传区域文字提示 string -
image-fit 预览图裁剪模式,可选值参考小程序image组件的mode属性 string scaleToFill
use-before-read 是否开启文件读取前事件 boolean -
camera 当 accept 为 video media 时生效,可选值为 back front string
compressed 当 accept 为 video 时生效,是否压缩视频,默认为true boolean true
max-duration 当 accept 为 video、media 时生效,拍摄视频最长拍摄时间,单位秒 number 60
media-type 当 accept 为 media 时生效,选择的文件的文件类型,可选值为 image video string[] ['image', 'video']
extension 当 accept 为 file 时生效,根据文件拓展名过滤可选择文件。每一项都不能是空字符串。默认不过滤 string[] undefined_
upload-icon 上传区域图标 string plus

# accept 的合法值

参数 说明
media 图片和视频
image 图片
video 视频
file 从客户端会话选择图片和视频以外的文件
all 从客户端会话选择所有文件

# FileList

file-list 为一个对象数组,数组中的每一个对象包含以下 key。

参数 说明
url 图片和视频的网络资源地址
name 文件名称,视频将在全屏预览时作为标题显示
thumb 图片缩略图或视频封面的网络资源地址,仅对图片和视频有效,accept 为 video时,真机不会返回该属性,建议使用 media 和 media-type 配合完成视频上传
type 文件类型,可选值image video file
isImage 手动标记图片资源
isVideo 手动标记视频资源

# Slot

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

# Events

|

事件名 说明 回调参数
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: 删除图片的序号值