Uploader 文件上传

介绍

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

引入

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

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

图片预览

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

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

图片可删除状态

通过deletable属性可控制是否开启所有图片的可删除状态,deletable默认为true,即所有图片都可删除。

若希望控制单张图片的可删除状态,可将deletable属性设置为true,并在fileList中为每一项设置deletable属性。

  1. <van-uploader file-list="{{ fileList }}" deletable="{{ true }}" />
  1. Page({
  2. data: {
  3. fileList: [
  4. {
  5. url: 'https://img.yzcdn.cn/vant/leaf.jpg',
  6. },
  7. {
  8. url: 'https://img.yzcdn.cn/vant/tree.jpg',
  9. deletable: false,
  10. },
  11. ],
  12. },
  13. });

上传状态

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

  1. <van-uploader file-list="{{ fileList }}" />
  1. Page({
  2. data: {
  3. fileList: [
  4. {
  5. url: 'https://img.yzcdn.cn/vant/leaf.jpg',
  6. status: 'uploading',
  7. message: '上传中',
  8. },
  9. {
  10. url: 'https://img.yzcdn.cn/vant/tree.jpg',
  11. status: 'failed',
  12. message: '上传失败',
  13. },
  14. ],
  15. },
  16. });

限制上传数量

通过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 表示校验失败。

  1. <van-uploader
  2. file-list="{{ fileList }}"
  3. accept="media"
  4. use-before-read
  5. bind:before-read="beforeRead"
  6. bind:after-read="afterRead"
  7. />
  1. Page({
  2. data: {
  3. fileList: [],
  4. },
  5. beforeRead(event) {
  6. const { file, callback } = event.detail;
  7. callback(file.type === 'image');
  8. },
  9. });

云开发示例

上传图片至云存储

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

  1. // 上传图片
  2. uploadToCloud() {
  3. wx.cloud.init();
  4. const { fileList } = this.data;
  5. if (!fileList.length) {
  6. wx.showToast({ title: '请选择图片', icon: 'none' });
  7. } else {
  8. const uploadTasks = fileList.map((file, index) => this.uploadFilePromise(`my-photo${index}.png`, file));
  9. Promise.all(uploadTasks)
  10. .then(data => {
  11. wx.showToast({ title: '上传成功', icon: 'none' });
  12. const newFileList = data.map(item => ({ url: item.fileID }));
  13. this.setData({ cloudPath: data, fileList: newFileList });
  14. })
  15. .catch(e => {
  16. wx.showToast({ title: '上传失败', icon: 'none' });
  17. console.log(e);
  18. });
  19. }
  20. }
  21. uploadFilePromise(fileName, chooseResult) {
  22. return wx.cloud.uploadFile({
  23. cloudPath: fileName,
  24. filePath: chooseResult.url
  25. });
  26. }

API

Props

参数说明类型默认值
name标识符,可以在回调函数的第二项参数中获取string | number-
accept接受的文件类型, 可选值为all media image file videostringimage
sizeType所选的图片的尺寸, 当acceptimage类型时设置所选图片的尺寸可选值为original compressedstring[][‘original’,’compressed’]
preview-size预览图和上传区域的尺寸,默认单位为pxstring | number80px
preview-image是否在上传完成后展示预览图booleantrue
preview-full-image是否在点击预览图后展示全屏图片预览booleantrue
multiple是否开启图片多选,部分安卓机型不支持booleanfalse
disabled是否禁用文件上传booleanfalse
show-upload是否展示文件上传按钮booleantrue
deletable是否展示删除按钮booleantrue
capture图片或者视频选取模式,当acceptimage类型时设置capture可选值为camera可以直接调起摄像头string | string[][‘album’, ‘camera’]
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-
upload-icon上传区域图标,可选值见 Icon 组件stringplus

accept 的合法值

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

FileList

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

参数说明
url图片和视频的网络资源地址
name文件名称,视频将在全屏预览时作为标题显示
thumb图片缩略图或视频封面的网络资源地址,仅对图片和视频有效
type文件类型,可选值image video file
isImage手动标记图片资源
isVideo手动标记视频资源

Slot

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

Events

事件名说明回调参数
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