Antd - 上传图片 裁剪图片

目录

  • 本地上传方法【input type="file"】:
  • upload组件【antd】
    • 默认接口上传:
    • 自定义接口上传:【取消默认上传接口】
      • antd的upload组件beforeUpload还有个比较坑的地方
    • upload结合裁剪
      • 1、antd官方裁剪组件:![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b90d70cf3bc94cc69b7a9dd67df3a90c.png)
      • 2、antd裁剪图片二次开发
    • 结合form表单使用:

本地上传方法【input type=“file”】:

  • js操作本地文件,通过input type="file"选择本地文件

    const fileInput = document.createElement('input');
    fileInput.type = 'file'; // js创建file类型input
    fileInput.click(); // 触发
    fileInput?.addEventListener('change', (event) => {const file = event.target?.files[0]; // target返回事件的目标节点,现返回的是input节点本身const reader = new FileReader(); // FileReader 只能访问用户明确选择的文件内容reader.readAsDataURL(file); // readAsDataURL:开始读取指定的 Blob 中的内容。一旦完成,result 属性中将包含一个表示文件数据的 data: URLreader.addEventListener('load', () => {console.log(reader.result);});
    });// 用户触发行为点击上传文件
    <input type="file" id="file-input">
    const fileInput = document.getElementById('file-input');
    // 后续同上上传代码
    

    上传的文件想要不同格式时,可以使用FileReader不同的实例方法获取:

    • readAsArrayBuffer() - 标识文件数据的ArrayBuffer对象在这里插入图片描述

    • readAsBinaryString() - 表示文件中原始二进制数据的字符串在这里插入图片描述

    • readAsDataURL() - 表示文件数据的data:URL在这里插入图片描述

    • readAsText() - 表示所读取的文件内容的字符串,可以制定可选的编码名称在这里插入图片描述

upload组件【antd】

默认接口上传:

  • 使用action属性拼接完整的请求接口地址,eg:action={baseURL + ‘/v1/object/uploadicon’}
  • 使用默认上传时注意,需要将token携带到请求头属性中
  • 在这里插入图片描述

自定义接口上传:【取消默认上传接口】

  • 首先取消默认上传时的接口,在beforeUpload方法return false,来阻止默认上传。即【Upload上传有个action的坑,就是你选择文件之后自动调用地址然后就会执行上传接口,如果不取消会一直有一个失败请求,但不影响主体流程】在这里插入图片描述

  • 上传前文件格式校验

  • 在上传文件校验或onchange方法中获取上传的文件,进行自定义接口请求传递

 const props: UploadProps = {name: 'file',multiple: false,showUploadList: false,async beforeUpload(file) {setImgLoading(true)const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png' || file.type === 'image/jpg' || file.type === 'image/webp';const isLt2M = file.size / 1024 / 1024 < 2;const isSize = await new Promise<boolean>((resolve) => {const _URL = window.URL || window.webkitURL;const img = new Image();img.onload = () => {const valid = img.width / img.height === 1;resolve(valid);};img.src = _URL.createObjectURL(file);});if (!isJpgOrPng) {message.error('请上传png、jpeg、jpg、webp格式图片');} else if (!isLt2M) {message.error('上传图片大小不超过2M');} else if (!isSize) {message.error('上传图片比例建议1:1');}if (!isJpgOrPng || !isLt2M || !isSize) {return Upload.LIST_IGNORE;}return false; // 因为自定义接口请求,没有设置action值,所以关闭默认上传事件},onChange(file){const files = new FormData();files.append('file', file.file);// 将files上传给后端接口处理}};

antd的upload组件beforeUpload还有个比较坑的地方

beforeUpload校验不通过return false的话,onchange中还是会接收到file上传文件信息
在这里插入图片描述

解决方法:在beforeUpload校验不通过时return Upload.LIST_IGNORE 阻止文件上传,此时onChange就接收不到不合校验规则的file了

在这里插入图片描述

upload结合裁剪

1、antd官方裁剪组件:在这里插入图片描述

裁剪组件是配合 antd-img-crop 实现上传前裁切图片,可以进行属性动态配置

在这里插入图片描述

上传前裁剪图片官方使用:

import React, { useState } from 'react';
import { Upload } from 'antd';
import type { GetProp, UploadFile, UploadProps } from 'antd';
import ImgCrop from 'antd-img-crop';type FileType = Parameters<GetProp<UploadProps, 'beforeUpload'>>[0];const App: React.FC = () => {const [fileList, setFileList] = useState<UploadFile[]>([{uid: '-1',name: 'image.png',status: 'done',url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',},]);const onChange: UploadProps['onChange'] = ({ fileList: newFileList }) => {setFileList(newFileList);};const onPreview = async (file: UploadFile) => {let src = file.url as string;if (!src) {src = await new Promise((resolve) => {const reader = new FileReader();reader.readAsDataURL(file.originFileObj as FileType);reader.onload = () => resolve(reader.result as string);});}const image = new Image();image.src = src;const imgWindow = window.open(src);imgWindow?.document.write(image.outerHTML);};return (<ImgCrop rotationSlider><Uploadaction="https://660d2bd96ddfa2943b33731c.mockapi.io/api/upload"listType="picture-card"fileList={fileList}onChange={onChange}onPreview={onPreview}>{fileList.length < 5 && '+ Upload'}</Upload></ImgCrop>);
};export default App;

2、antd裁剪图片二次开发

antd官方提供的裁剪可以设置裁剪的比例、形状,放大缩小、旋转按钮显隐等,但一般实际开发时需求与官方例子会略有差异,需要进行裁剪组件源码理解以及二次开发

开发需求要求(重新上传、任务对比框、重新打开裁剪框等):
在这里插入图片描述
将antd封装的官方裁剪组件代码拉取到项目中进行再次开发

组件源码目录
在这里插入图片描述
具体的二次开发步骤后续更新 ~

结合form表单使用:

上传图片结合form表单使用时,页面的图片字段检测不到Upload上传图片获取的url数据变化导致图片更新问题,如何实现检测数据变化

  • 使用onValuesChange方法 或 使用Form.useWatch方法
  • 还有一个笨方法是,React设置一个setStatus实时变量 和 form对应图片字段进行数值更新,使用实时变量进行页面的渲染在这里插入图片描述

有不对的地方请大佬们指正 ^^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855748.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue - 第3天

文章目录 一、Vue生命周期二、Vue生命周期钩子三、工程化开发和脚手架1. 开发Vue的两种方式2. 脚手架Vue CLI基本介绍&#xff1a;好处&#xff1a;使用步骤&#xff1a; 四、项目目录介绍和运行流程1. 项目目录介绍2. 运行流程 五、组件化开发六、根组件 App.vue1. 根组件介绍…

python学习笔记-08

面向对象基础(OOP)-上 1. 面向对象概述 面向过程&#xff1a;根据业务逻辑从上到下写代码 函数式&#xff1a;将某功能代码封装到函数中&#xff0c;日后便无需重复编写&#xff0c;仅调用函数即可 面向对象(object oriented programming)&#xff1a;将数据与函数绑定到一起…

微信小程序毕业设计-电影院订票选座系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

【JS重点14】内置构造函数

目录 一:Object构造函数 1 创建对象说明 2 关于Object的三个常用静态方法 Object.keys() Object.values() Object.assign() 二:Array构造函数 1 数组对象的常见实例方法 2 详解reduce实例方法 语法规则&#xff1a; 运行细节&#xff1a; 案例&#xff1a; 3 map()…

【C++高阶】高效搜索的秘密:深入解析搜索二叉树

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C多态 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀二叉搜索树 &#x1f4d2;1. 二叉搜索树&…

一键解压,无限可能——BetterZip,您的Mac必备神器!

BetterZip for Mac 是一款高效、智能且安全的解压缩软件&#xff0c;专为Mac用户设计。它提供了直观易用的界面&#xff0c;使用户能够轻松应对各种压缩和解压缩需求。 这款软件不仅支持多种压缩格式&#xff0c;如ZIP、RAR、7Z等&#xff0c;还具备快速解压和压缩文件的能力。…

qt 5.6 qmake手册

qt 5.6 qmake手册 &#xff08;笔者翻译的qmake手册&#xff0c;多数是机翻&#xff0c;欢迎评论区纠错修正&#xff09; Qmake工具有助于简化跨不同平台开发项目的构建过程。它自动生成Makefile&#xff0c;因此创建每个Makefile只需要几行信息。您可以将qmake用于任何软件项目…

32.双击列表启动目标游戏

上一个内容&#xff1a;31.加载配置文件中的游戏到辅助列表 以 31.加载配置文件中的游戏到辅助列表 它的代码为基础进行修改 效果图&#xff1a; 添加列表双击事件 实现代码&#xff1a; LPNMITEMACTIVATE pNMItemActivate reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR…

考研数学强化,880+660正确打开方式

1800题基础做完了&#xff1f;做的怎么样&#xff01; 之所以问你做的怎么样&#xff0c;是因为1800题做的好坏&#xff0c;直接决定了你要不要开始做880题和660题。 有的同学1800题做的很好&#xff0c;做完1800题之后开始做880660没毛病 但是有的同学就是纯纯的为了做题而…

python使用哪种数据库

MySQL 是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关…

阿里云SSL免费证书部署(nginx)

1.先在阿里云领取免费证书 创建证书 下载证书 得到nginx证书和密钥的压缩包 2.配置nginx 将两个文件放进nginx的opt目录下 先检查有没有ngx_http_ssl_module模块 ngixn -V 如果有进入下一步&#xff0c;没有继续 1.找到你nginx的文件 2.进入添加模块 ./configure --with-h…

git的Cherry pick

Cherry pick Git Cherry Pick详解 https://blog.csdn.net/jam_yin/article/details/131594716 目标: 将开发分支A中提交的部分内容合并到B分支(可能是测试分支) 步骤: vscode安装 点击下图标进入graph

最新版本IntelliJ IDEA安装与“坤活”使用

最新版本IntelliJ IDEA安装与“科学”使用 IntelliJ IDEA安装与坤活下载安装坤活idea1.将下面两个压缩文件解压到安装位置&#xff0c;注意路径不要包含中文空格等特殊符号2.双击 install-all-users.vbs &#xff0c;然后点击确定&#xff0c;等到出现 Done的弹窗3. 打开idea复…

远程桌面另一台服务器连接不上,局域网IP如何访问另一台服务器

在IT运维工作中&#xff0c;远程桌面连接是日常工作中不可或缺的一部分。然而&#xff0c;当尝试远程桌面连接至另一台服务器时&#xff0c;如果连接不上&#xff0c;可能会引发一系列问题&#xff0c;影响到工作效率和信息安全。特别是在局域网环境中&#xff0c;确保能够正确…

AI口语练习APP的技术难点

AI口语练习APP旨在帮助用户练习口语&#xff0c;因此其核心功能是语音识别和语音评测。以下是一些AI口语练习APP的主要技术难点。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 语音识别 语音识别是将语音信号转换为文本的过程。…

【golang学习之旅】使用VScode安装配置Go开发环境

1. 下载并安装Go1.1 下载地址1.2 选择版本并下载1.3 安装目录1.4 验证是否安装成功 2. 配置环境变量2.1 配置步骤2.2 GO部分环境变量说明 3. 下载或更新 Vscode3.1 下载地址3.2 安装步骤 4. 为Go开发配置VScode 1. 下载并安装Go 1.1 下载地址 https://studygolang.com/dl 1.…

ChinaTravel成流量密码,景区如何打造视频监控管理平台提升旅游体验

随着中国经济的飞速发展和人民生活水平的持续提高&#xff0c;旅游已经成为越来越多人休闲放松的首选方式。近期&#xff0c;随着互联网的普及和社交媒体的兴起&#xff0c;以及免签政策带火入境游&#xff0c;“ChinaTravel”已成为社交网络上的一大流量密码&#xff0c;吸引了…

送检了200多款主食冻干,花费百万后,我测评了VE、希喂、朗诺!

主食冻干真是养猫的好帮手&#xff0c;方便、易喂&#xff0c;还能为猫咪提供全面营养&#xff01;它模拟了猫咪的自然捕猎饮食&#xff0c;采用低温脱水和灭菌技术制成。这样的主食冻干不仅让铲屎官们的喂养变得轻松&#xff0c;还满足了猫咪的味蕾和营养需求。更重要的是&…

跟《经济学人》学英文:2024年6月15日这期 Chinese electric vehicles (EVs)

The EU hits China’s carmakers with hefty new tariffs Duties will only hold them back for a while 欧盟对中国汽车制造商征收高额新关税 hit: 对xxx施加 在句子"The EU hits China’s carmakers with hefty new tariffs"中&#xff0c;“hits”的意思是“对…

Fastjson 结合 jdk 原生反序列化的利用手法 ( Aliyun CTF )

2023 Aliyun CTF ezbean是一道CTF java反序列化题目。 题目的目的是让选手通过一个java原生反序列化入口&#xff0c;最终达成RCE。本文对题目的几种解法做了具体的分析&#xff0c;主要分为预期解法和非预期解法两种思路。通过对Fastjson在反序列化的行为分析&#xff0c;从两…