您现在的位置是:首页 >学无止境 >react antd upload组件的beforeupload限制网站首页学无止境

react antd upload组件的beforeupload限制

漠月瑾-西安 2025-02-19 00:01:03
简介react antd upload组件的beforeupload限制

本次主要记录3种限制

  • 图片尺寸
  • 图片格式
  • 图片宽高

容易出现的错误现象

  • 正常报错,但是没有阻止图片上传

前期解释说明:

在 React 的 Ant Design (antd) 库中,beforeUpload 是一个用于在上传文件之前执行某些操作的钩子函数。它通常用于验证文件类型、大小,或在文件上传前进行一些预处理。beforeUpload 函数可以返回一个布尔值、一个 Promise 或者使用 async/await 语法。

为什么要用 Promise?

主要是异步操作:beforeUpload(本身是个同步函数) 可能需要执行异步操作,例如从服务器获取数据、读取文件内容等。使用 Promise 可以方便地处理这些异步操作。

用了Promise还是无法阻止上传

虽然我用了reject,报错正常出现,但是无法阻止上传,对于此现象,我的最终解决方法是,外层定义

 **let isPassUploadLimit = false;**

beforeUpload代码展示

const beforeUpload = (file: any) => {
       return new Promise((resolve, reject) => {
           let isJpgOrPng = file.name.endsWith(".png") || file.name.endsWith(".jpeg") || file.name.endsWith(".jpg");
           const isLt1M = file.size / 1024 / 1024 < 1;

           // 使用 FileReader 读取文件
           const reader = new FileReader();
           reader.readAsDataURL(file);  // 将文件读取为 Data URL

           reader.onload = (event:any) => {
               const img: any = new Image();
               img.src = event.target.result;
               
               img.onload = () => {
                   const height = img.height;
                   if (height > 160) {
                       notification.error({ key: "upadatable", message: "图片高度不超过160px", top: 60 });
                       reject("图片高度不超过160px");
                       return;
                   }
                   if (!isJpgOrPng) {
                       notification.error({ key: "upadatable", message: "仅支持支持png、jpeg、jpg格式文件", top: 60 });
                       reject("仅支持支持png、jpeg、jpg格式文件");
                       return;
                   } else if (!isLt1M) {
                       notification.error({ key: "upadatable", message: "最大不能超过1M", top: 60 });
                       reject("最大不能超过1M");
                       return;
                   }
                   resolve(true);
                   isPassUploadLimit = true;
               };
           }
       })
   };
在change函数中做如下判断即可
   const handleChange = (info: any) => {
       if (info.file.status === "uploading" || **!isPassUploadLimit**) {
           return;
       }
       if (info.file.status === "done") {
           // 写出你的逻辑
       }
   };

受时间限制,直接展示了代码供大家一起学习。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。