antdv 限制文件上传类型

461 阅读2分钟

项目使用的是1.x版本,根据antdv官方文档的例子,使用beforeUpload限制文件上传类型。

    beforeUpload(file) {  
      let arr = file.name.split(".");
      let str = arr[arr.length - 1].toLowerCase();
      if (
        !(
          str == "png" ||
          str == "jpg" ||
          str == "jpeg" ||
          str == "pdf"
        )
      ) {
        this.$message.error(
          "请上传以下格式的文件:jpg(jpeg)、png、pdf"
        );
        return false;
      }
      return true;
    }

❌ok,好家伙,错误是提示了,但是文件还是显示在了列表里。(原因

再看一眼官方文档~

beforeUpload 的返回值可以是一个 Promise 以支持异步处理,如服务端校验等

好的,那试试上 Promise。

    beforeUpload(file) {
      return new Promise((resolve, reject) => {
        let arr = file.name.split(".");
        let str = arr[arr.length - 1].toLowerCase();
        if (
          !(
            str == "png" ||
            str == "jpg" ||
            str == "jpeg" ||
            str == "pdf" 
          )
        ) {
          this.$message.error(
            "请上传以下格式的文件:jpg(jpeg)、png、pdf"
          );
          return reject(false);
        }
        return resolve(true);
      });
    }

⭕提示文件类型不对时,错误文件没有出现在列表里。
很久很久之后发现⚡惊天大雷⚡::multiple="true"时不要使用promise方法,此时可参考此文章

后记(💔可以不看)

A fews days later~~~

没有任务,无聊之际,不知道怎么来到了MDN的<input type="file">页面,发现可以用accept属性指定可接受的文件类型。

  • accept="image/png" 或 accept=".png"——接受 PNG 文件。
  • accept="image/png, image/jpeg" 或 accept=".png, .jpg, .jpeg"——接受 PNG 或 JPEG 文件。
  • accept="image/*"——接受任何带有 image/* MIME 类型的文件。(许多移动设备也允许用户在使用它时用摄像头拍照。)
  • accept=".doc,.docx,.xml,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document"——接受类似于 MS Word 文档的任何文件。

嗯,难道可以用一个属性搞定的需求我却吭哧吭哧写了个方法。
再去看看antd官方文档,API确实有accept这个参数。

image.png

好的,马上找出代码,在a-upload标签内加上accept=".pdf,.png,.jpg,.jpeg"
效果不错,看到弹出的文件选择器只显示了accept值指定的文件类型,在选择阶段筛选出符合要求的文件,用户不会选到错误的文件。

继续往下看MDN,发现高兴的太早了🤨~

accept 属性不验证所选文件的类型;它只是为浏览器提供提示来引导用户选择正确的文件类型。用户仍然可以(在大多数情况下)在文件选择器中切换一个选项,使其能够覆盖此选项并选择他们希望的任何文件,然后选择不正确的文件类型。

什么!
能够覆盖此选项并选择他们希望的任何文件,然后选择不正确的文件类型!
能够选择不正确的文件类型!
不正确的文件类型!
不正确!

回去看看,怎么选择不正确的文件类型。
下拉选择“所有文件”,所有文件都可以选!

image.png

好吧,beforeUpload这个方法还是没有白写的,加回来~