ant design 预览图片_AntD框架的upload组件上传图片时遇到的一些坑

前言

本次做后台管理系统,采用的是 AntD 框架。涉及到图片的上传,用的是AntD的 upload 组件。

前端做文件上传这个功能,是很有技术难度的。既然框架给我们提供好了,那就直接用呗。结果用的时候,发现 upload 组件的很多bug。下面来列举几个。

备注:本文写于2019-03-02,使用的 antd 版本是 3.13.6。

使用 AntD 的 upload 组件做图片的上传

因为需要上传多张图片,所以采用的是照片墙的形式。上传成功后的界面如下:

(1)上传中:

bb15562f31fb6249b0f7d00914e6880b.png

(2)上传成功:

2f998f106a6ef36ce2f9ddfc436aab28.png

(3)图片预览:

91c0df85b376ff1b28cd37cb4db0eab3.png

按照官方提供的实例,特此整理出项目开发中的完整写法,亲测有效。代码如下:

/* eslint-disable */import { Upload, Icon, Modal, Form } from 'antd';const FormItem = Form.Item;class PicturesWall extends PureComponent { state = { previewVisible: false, previewImage: '', imgList: [], }; handleChange = ({ file, fileList }) => { console.log(JSON.stringify(file)); // file 是当前正在上传的 单个 img console.log(JSON.stringify(fileList)); // fileList 是已上传的全部 img 列表 this.setState({ imgList: fileList, }); }; handleCancel = () => this.setState({ previewVisible: false }); handlePreview = file => { this.setState({ previewImage: file.url || file.thumbUrl, previewVisible: true, }); }; // 参考链接:https://www.jianshu.com/p/f356f050b3c9 handleBeforeUpload = file => { //限制图片 格式、size、分辨率 const isJPG = file.type === 'image/jpeg'; const isJPEG = file.type === 'image/jpeg'; const isGIF = file.type === 'image/gif'; const isPNG = file.type === 'image/png'; if (!(isJPG || isJPEG || isGIF || isPNG)) { Modal.error({ title: '只能上传JPG 、JPEG 、GIF、 PNG格式的图片~', }); return; } const isLt2M = file.size / 1024 / 1024 < 2; if (!isLt2M) { Modal.error({ title: '超过2M限制 不允许上传~', }); return; } return (isJPG || isJPEG || isGIF || isPNG) && isLt2M && this.checkImageWH(file); }; //返回一个 promise:检测通过则返回resolve;失败则返回reject,并阻止图片上传 checkImageWH(file) { let self = this; return new Promise(function(resolve, reject) { let filereader = new FileReader(); filereader.onload = e => { let src = e.target.result; const image = new Image(); image.onload = function() { // 获取图片的宽高,并存放到file对象中 console.log('file width :' + this.width); console.log('file height :' + this.height); file.width = this.width; file.height = this.height; resolve(); }; image.onerror = reject; image.src = src; }; filereader.readAsDataURL(file); }); } handleSubmit = e => { const { dispatch, form } = this.props; e.preventDefault(); form.validateFieldsAndScroll((err, values) => {// values 是form表单里的参数 // 点击按钮后,将表单提交给后台 dispatch({ type: 'mymodel/submitFormData', payload: values, }); }); }; render() { const { previewVisible, previewImage, imgList } = this.state; // 从 state 中拿数据 const uploadButton = ( 
Upload
); return (
{getFieldDecorator('myImg')( ({ // data里存放的是接口的请求参数 param1: myParam1, param2: myParam2, photoCotent: file, // file 是当前正在上传的图片 photoWidth: file.height, // 通过 handleBeforeUpload 获取 图片的宽高 photoHeight: file.width, })} listType="picture-card" fileList={this.state.imgList} onPreview={this.handlePreview} // 点击图片缩略图,进行预览 beforeUpload={this.handleBeforeUpload} // 上传之前,对图片的格式做校验,并获取图片的宽高 onChange={this.handleChange} // 每次上传图片时,都会触发这个方法 > {this.state.imgList.length >= 9 ? null : uploadButton} )}
); }}export default PicturesWall;

上传后,点击图片预览,浏览器卡死的问题

依据上方的代码,通过 Antd 的 upload 组件将图片上传成功后,点击图片的缩略图,理应可以在当前页面弹出 Modal,预览图片。但实际的结果是,浏览器一定会卡死。

定位问题发现,原因竟然是:图片上传成功后, upload 会将其转为 base64编码。base64这个字符串太大了,点击图片预览的时候,浏览器在解析一大串字符串,然后就卡死了。详细过程描述如下。

上方代码中,我们可以把 handleChange(file, fileList)方法中的 file、以及 fileList打印出来看看。 file指的是当前正在上传的 单个 img,fileList是已上传的全部 img 列表。 当我上传完 两张图片后, 打印结果如下:

file的打印的结果如下:

 { "uid": "rc-upload-1551084269812-5

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

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

相关文章

奇妙的安全旅行之国密算法

hi&#xff0c;大家好&#xff0c;我是开发者FTD。今天我们来介绍一下我们国家密码局制定的加密算法 — 国密算法。 为什么要制定国密算法&#xff1f; 密码算法是保障信息安全的核心技术&#xff0c;尤其是我国最关键的银行业核心领域长期以来都是沿用MD5、3DES、SHA-256、R…

Kali Linux—借助 SET+MSF 进行网络钓鱼、生成木马、获主机shell、权限提升、远程监控、钓鱼邮件等完整渗透测试(二)

远控木马 SET 同时集成了木马生成工具&#xff0c;可以生成木马并调用MSF框架对远程主机进行控制。直接使用MSF生成木马并控制主机的可参考之前另一篇博文&#xff1a;渗透测试-Kali入侵Win7主机。 控制主机 1、运行 SET&#xff0c;选择创建攻击载荷和监听器&#xff1a; 2…

wdnas群晖nas_西数WD NAS红盘 WD140EFFX 14TB HDD和 SA500 1TB SSD开箱拆解评测

前言每个NAS系统都应该配备足够容量的硬盘&#xff0c;以满足数据存储需求。WD Red 西数红盘存储空间高达14TB&#xff0c;可以为需要构建大容量和高性能NAS存储方案的用户提供解决方案。WD Red西数红盘14T运行安静且热量低&#xff0c;其采用的NASware 3.0技术提高了兼容性、集…

奇妙的安全旅行之加密算法(完整版)

hi&#xff0c;大家好&#xff0c;我是开发者FTD。之前我在公众号写了一个工作中常用加密算法系列的文章终于肝完了&#xff0c;为了方便小伙伴们查看和收藏&#xff0c;我将这个系列汇集整理成了一个PDF文档&#xff0c;有需要的小伙伴可以关注公众号&#xff0c;在公众号后台…

智能车s3010舵机工作电压_全国大学生智能车竞赛决战南京信息工程大学

未来网高校频道8月25日讯(记者 杨子健 通讯员 唐翠梅 方向 张峰 曾雅俊)8月24日上午&#xff0c;由中国自动化学会主办&#xff0c;南京信息工程大学承办的第十五届全国大学生智能汽车竞赛创意组总决赛、第十五届全国大学生智能汽车竞赛华东赛场预决赛开幕仪式在学校东苑体育馆…

直接拿来用!GitHub10个开源免费的后台管理面板

hi&#xff0c;大家好&#xff0c;我是开发者FTD。今天要给大家介绍几个GitHub上开源免费好用的后台管理面板&#xff0c;大家在平时工作中&#xff0c;一定不可避免的会开发一些业务管理控制后台&#xff0c;如果从零开始完整的做一套不是一件很容易的事情&#xff0c;还好Git…

人名和成绩一起排序_EXCEL基础知识——排序功能的使用

排序筛选可能是大家工作中最常用的数据处理方式了&#xff0c;它能很快地从大到小完成排序&#xff0c;并且筛选除你想要的数据。从简单的排序筛选到高级筛选你会哪几步呢&#xff1f;一起来看看。一、简单排序下面这组数据&#xff0c;我们想要将数学成绩从大到小的排序&#…

android骰子游戏代码_真神器!不用手写一行代码就能做网站~

点击上方“Python编程时光”&#xff0c;选择“加为星标”第一时间关注Python技术干货&#xff01;制作网站用什么&#xff0c;Dreamweaver 还是 Fireworks&#xff1f;现在&#xff0c;用 GPT-3 就可以。一位来自旧金山的程序员小哥做了款名为 debuild.co 的网页制作软件&…

一文带你读懂计算机进制

hi&#xff0c;大家好&#xff0c;我是开发者FTD。在我们的学习和工作中少不了与进制打交道&#xff0c;从出生开始上学&#xff0c;最早接触的就是十进制&#xff0c;当大家学习和使用计算机时候&#xff0c;我们又接触到了二进制、八进制以及十六进制。那么大家对进制的认识和…

切换分支 如何判断 是否完成_如何判断展览公司是否专业?

可以看出&#xff0c;展会装修目前市场上的展览设计公司数量非常庞大&#xff0c;许多公司目前正在从事这方面的业务。对于每个人来说&#xff0c;展览设计公司之后有很多好处&#xff0c;所以当你继续选择时&#xff0c;选择面会变得更加广泛。无论人们如何选择展览设计公司&a…

二月:冷清的春节

hi&#xff0c;大家好&#xff0c;我是开发者FTD。二月份就这么悄无声息的过完了&#xff0c;时间真的过得太快了&#xff0c;而且二月份还比其他月少了几天&#xff0c;再加上春节的时间&#xff0c;感觉就更快了。按照惯例&#xff0c;今天也对二月份做个总结&#xff0c;以迎…

python 除法取模_跟我一起学python | 探究05

算术运算、比较运算、赋值运算、位和位运算、运算优先级python里的算术运算我们最熟悉的计算就是算术运算&#xff0c;加减乘除等。在python的算术运算中&#xff0c;除了四则运算外&#xff0c;还有幂运算、取模、取整运算。什么是取模、取整运算呢&#xff1f;取模和取整运算…

中有atoi函数吗_C++ 多态的实现及原理,深挖vptr指针,手动调用虚函数

什么是多态&#xff1f;父类指针即根据指向的不同对象&#xff0c;响应同一消息(函数调用)&#xff0c;产生不同行为。多态三要素&#xff1f;1&#xff0c;继承2&#xff0c;虚函数重写3&#xff0c;父类指针(引用)指向子类对象多态的实现很简答&#xff0c;让我们来看一段代码…

一文带你读懂base64编码

hi&#xff0c;大家好&#xff0c;我是开发者FTD。相信很多同学在工作中&#xff0c;经常会用到Base64编码&#xff0c;那大家知道为什么会有Base64编码吗&#xff1f;我们为什么要使用它呢&#xff0c;它又是怎么实现的呢&#xff1f;下面就让我们来一起深入探究一下Base64编码…

不显示参数名_第51p,万能参数与返回值,Python中函数的返回值

大家好&#xff0c;我是杨数Tos&#xff0c;这是《从零基础到大神》系列课程的第51篇文章&#xff0c;第三阶段的课程&#xff1a;Python进阶知识&#xff1a;详细讲解Python中的函数&#xff08;四&#xff09;>函数的参数与返回值&#xff08;下篇&#xff09;。函数是非常…

阿里云服务器安装JDK指南

hi&#xff0c;大家好啊&#xff0c;好久不见&#xff0c;最近阿里云双十一做活动&#xff0c;很多博主都在做购买返现活动&#xff0c;不知道大家有没有去白嫖他们一个服务器&#xff0c;服务器买来可以用来学习一下服务器搭建&#xff0c;应用部署等等&#xff0c;可以做的事…

word如何设置长宽高_word怎么设计表格高和宽

在word中输入文字可能大部分人都能熟练掌握&#xff0c;但是有时word中也需要插入表格&#xff0c;这样不仅能准确的表达出想要表达的意思&#xff0c;那么下面就由学习啦小编给大家分享下技巧&#xff0c;希望能帮助到您。word设计表格高和宽的步骤如下&#xff1a;步骤一&…

python字符串筛选输出_如何在Python中过滤字符串列表

Python使用列表数据类型在顺序索引中存储多个数据。它的工作方式类似于其他编程语言的数字数组。filter()方法是Python的一种非常有用的方法。可以使用filter()方法从Python中的任何字符串、列表或字典中过滤一个或多个数值。它根据任何特定条件过滤数据。当条件返回true时&…

销售流程图_工作流程图网络图模板,招聘销售合同库存,完整设计拿来就用

Hello大家好&#xff0c;我是帮帮。今天跟大家分享一组工作流程图模板&#xff0c;招聘销售合同库存&#xff0c;完整设计拿来就用。为了让大家能更稳定的下载模板&#xff0c;我们又开通了全新下载方式(见文章末尾)&#xff0c;以便大家可以轻松获得免费模板和收费模板。メ大家…

协议详解_I2C协议详解

I2C通信协议I2C通信协议的基础简介I2C「Inter-integrated Circuit」总线支持设备之间的短距离通信&#xff0c;用于处理器和一些外围设备之间的接口&#xff0c;它只需要两根信号线来完成信息交换。I2C最早是飞利浦在1982年开发设计。I2C是同步传输信号&#xff0c;关于同步和异…