Antd react上传图片格式限制的实现代码

 更新时间:2024年12月21日 12:07:16   作者:向画  
这篇文章主要介绍了Antd react上传图片格式限制的实现代码,本文通过实例代码图文效果给大家介绍的非常详细,感兴趣的朋友一起看看吧

限制分辨率(像素)

<a-upload
:before-upload="beforeUpload"
  >
  // 上传图片宽高比例限制
  const beforeUpload = file => {
    return new Promise((resolve, reject) => {
      // // 图片类型限制
      // let isJpgOrPng = file.type === 'image/png' || file.type === 'image/jpg';
      // if (!isJpgOrPng) {
      //   message.error('格式错误,只能上传jpg、jpeg、png');
      //   return reject(false);
      // }
      // 图片宽高比例限制
      let w = 0,
        h = 0;
      let reader = new FileReader();
      reader.readAsDataURL(file);
      reader.onload = () => {
        const image = new Image();
        image.src = reader.result;
        image.onload = () => {
          w = image.width;
          h = image.height;
          const ratio = 670 / 320;
          if (w / h == ratio) {
            // 图片比例为670*320横纵比一致
            return resolve(true);
          } else {
            message.error('图片尺寸错误,只能上传670x320横纵比一致的图片');
            return reject(false);
          }
        };
      };
      // 图片大小限制
      let isLt1M = file.size / 10240 / 10240 <= 1;
      if (!isLt1M) {
        message.error('图片大小超过10MB!');
        return reject(false);
      }
      // return isJpgOrPng && isLt1M; // 限制宽高比例、大小及类型
      return isLt1M; // 只限制宽高和大小
    });
  };

new FileReader(); new Image();

获取图片上传的像素宽高

AI解释

`new FileReader();` 是 JavaScript 中用于读取文件的一个构造函数。它创建了一个 `FileReader` 对象,能够异步读取本地文件的数据(如文本、图像等),将其以不同格式返回。
### 主要用途:
1. **异步读取文件**:可以从用户选择的文件中读取数据,而不会阻塞主线程。文件读取操作是异步的,即使文件很大,用户仍然可以继续与页面交互。
2. **支持多种格式**:`FileReader` 可以以多种格式读取文件,例如:
   - `readAsText(file)`:读取文件为文本。
   - `readAsDataURL(file)`:读取文件为 Data URL(如图像文件),可用于图像展示。
   - `readAsArrayBuffer(file)`:读取文件为 ArrayBuffer,用于处理二进制数据。
### 在代码中的使用:
在你的代码中,`new FileReader()` 被用来创建一个新的 `FileReader` 对象,以便读取用户上传的文件。接下来,你设置了 `onload` 事件处理程序,在文件读取完成后执行相关操作(例如创建一个 `Image` 对象来检查图像的尺寸)。
以下是一个简化的流程说明:
1. 用户选择文件(例如图像)。
2. 创建 `FileReader` 实例。
3. 使用 `reader.readAsDataURL(file)` 方法开始读取文件,该方法异步读取内容,并在完成后触发 `onload` 事件。
4. 在 `onload` 事件处理程序中,使用读取的结果(图像数据)进行尺寸检查。

其他限制,大小,数量

  const beforeUpload = (file, type,width, height) => {
    console.log('file=======',file)
    const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
    if (!isJpgOrPng) {
      message.error('请上传正确的图片格式');
    }
    const isLt2M = file.size / 1024 / 1024 < 2;
    const isLt300 = file.size / 1024 < 300;
    const isLt50 = file.size / 1024 < 50;
    if(type===1){
      // 限制图片像素宽高
      const width = 4836;
      const height = 3844;
      return new Promise((resolve, reject) => {
          let reader = new FileReader();
          console.log("reader===",reader)
          reader.addEventListener(
              'load',
              () => {
                  let img = new Image();
                  img.src = reader.result; 
                  img.onload = () => {
                      if (img.width < width || img.height < height) {
                          message.error('请上传宽高大于等于 4836*3844 的封面图!');
                          reject(new Error('请上传宽高大于等于 4836*3844 的封面图!'));
                          return;
                      } else {
                          resolve();
                      }
                  };
              },
          );
          reader.readAsDataURL(file);
      }).catch(() => {
        return false;
      })
    }
    if (type === 1 && !isLt2M) {
      message.error('图片大小不能超过2MB');
      return false
    }
    if ((type === 2 || type === 3 || type === 5) && !isLt300) {
      message.error('图片大小不能超过300KB');
      return false
    }
    if (type === 4 && !isLt50) {
      message.error('图片大小不能超过50KB');
      return false
    }
    const img = type === 1 && coverImage.length
    if (img) {
      message.error('只能上传一张图片');
    }
    const bg = type === 2 && backGroundImage.length
    if (bg) {
      message.error('只能上传一张图片');
    }
    const tt = type === 3 && topicImage.length
    if (tt) {
      message.error('只能上传一张图片');
    }
    const pi = type === 4 && prizeImage.length
    if (pi) {
      message.error('只能上传一张图片');
    }
    const sh = type === 5 && shareImage.length
    if (sh) {
      message.error('只能上传一张图片');
    }
    return isJpgOrPng && !img && !bg && !tt && !pi && !sh;
  }

到此这篇关于Antd react上传图片格式限制的文章就介绍到这了,更多相关Antd react上传图片格式限制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详细聊聊React源码中的位运算技巧

    详细聊聊React源码中的位运算技巧

    众所周知在React中,主要用到3种位运算符 —— 按位与、按位或、按位非,下面这篇文章主要给大家介绍了关于React源码中的位运算技巧的相关资料,需要的朋友可以参考下
    2021-10-10
  • 关于 React 中 useEffect 使用问题浅谈

    关于 React 中 useEffect 使用问题浅谈

    本文主要介绍了关于React中useEffect使用问题浅谈,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • React操作真实DOM实现动态吸底部的示例

    React操作真实DOM实现动态吸底部的示例

    本篇文章主要介绍了React操作真实DOM实现动态吸底部的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • react-native中ListView组件点击跳转的方法示例

    react-native中ListView组件点击跳转的方法示例

    ListView作为React Native的核心组件,用于高效地显示一个可以垂直滚动的变化的数据列表。下面这篇文章主要给大家介绍了关于react-native中ListView组件点击跳转的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • nginx配置React静态页面的方法教程

    nginx配置React静态页面的方法教程

    作为一个前端开发时刻想着,怎么把自己写的东西,丢到自己的服务器上面,然后展示给别人看。下面我就简单直白的写下,这篇文章主要给大家介绍了关于nginx配置React静态页面的方法教程,需要的朋友可以参考下。
    2017-11-11
  • react中的useEffect()的使用详解

    react中的useEffect()的使用详解

    useEffect()是react中的hook函数,作用是用于创建由渲染本身引起的操作,介绍了依赖项数组不同的区别,对react useEffect()使用相关知识感兴趣的朋友一起看看吧
    2024-05-05
  • react-native消息推送实现方式

    react-native消息推送实现方式

    这篇文章主要介绍了react-native消息推送实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • ReactJS中不同类型的状态详解

    ReactJS中不同类型的状态详解

    这篇文章主要为大家介绍了ReactJS中不同类型的状态详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • React官方团队完善原生Hook闭包陷阱

    React官方团队完善原生Hook闭包陷阱

    这篇文章主要为大家介绍了React官方团队出手,补齐原生Hook短板闭包陷阱的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • React和Vue组件更新的实现及区别

    React和Vue组件更新的实现及区别

    React 和 Vue 都是当今最流行的前端框架,它们都实现了组件化开发模式,本文将从React和Vue的组件更新原理入手,剖析两者虚拟DOM difer算法的异同点,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02

最新评论