Post

Element UI Multi-file Upload Gotcha

Why returning false in before-upload removes existing files from the list, and how to fix it for multi-file scenarios.

做文件上传,单文件的时候从来没觉得有什么问题。before-upload 里校验类型和大小,不通过就 return false,一切正常。

直到这次要上传多个文件——选了三张图,第四张不符合格式,校验不通过,return false,然后前三张也没了。

翻了一下文档和相关 issue,结论是:return false 会重置整个 fileList。element-ui 的机制是,校验不通过时上传流程中断,同时把已有的文件列表清空,连带着已经上传成功的文件一起消失。不是 bug,是设计——只是对单文件场景完全无所谓,对多文件场景就是个坑。

解决办法是不返回 false,改用 Promise.reject()。同样能停止上传,但不触发 fileList 重置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
beforeUpload(file) {
  const isJPG = file.type === 'image/jpeg' || file.type === 'image/png';
  const isLt500KB = file.size / 1024 < 500;

  if (!isJPG) {
    this.$message.error('只能上传 JPG/PNG 格式的图片');
    return Promise.reject();
  }

  if (!isLt500KB) {
    this.$message.error('图片大小不能超过 500KB');
    return Promise.reject();
  }

  return true;
},

就这一行区别。用了这么久 element-ui,多文件上传是第一次,踩了才知道。

This post is licensed under CC BY 4.0 by the author.