技术选型

前端技术选型: React Hook + typescript
antd版本:3.18

使用Upload上传图片

上传效果截图

预览效果截图


项目中完整写法:

import {Button, Form, Input, Modal, Upload, Icon} from 'antd';
const RegistrationForm = (props: IProps) => {const {form: { getFieldDecorator , validateFields},previewData} = props;const [filesList, setFilesList] = useState<UploadFile[]>([]);const [previewImage, setPreviewImage] = useState('');const [previewVisible, setPreviewVisible] = useState(false);const normFile = (e: any) => {if (Array.isArray(e)) {return e;}return e && e.fileList;};// 限制图片的格式,size,分辨率const handleBeforeUpload = (file: RcFile, FileList: RcFile[]): boolean | PromiseLike<void> => {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 false;}const isLt2M = file.size / 1024 / 1024 < 2;if (!isLt2M) {Modal.error({title: '超过2M限制,不允许上传~'});return false;}return (isJPG || isJPEG || isGIF || isPNG) && isLt2M && checkImageWH(file);};// 返回一个promise:通过检测则返回reslove;失败则返回reject,并阻止图片上传const checkImageWH = (file: RcFile): PromiseLike<void> => {const value: IFileProps =  file;return new Promise((resolve, reject) => {const filereader = new FileReader();filereader.onload = (e: any) => {const src = e.target.result;const image = new Image();image.onload = () => {value.width = image.width;value.height = image.height;resolve();};image.onerror = reject;image.src = src;};filereader.readAsDataURL(value);});};const handleChange = (info: UploadChangeParam) => {console.log(info.fileList);console.log(info.file);setFilesList(info.fileList);};const handleCancel = () => {setPreviewVisible(false);};const handlePreview = (file: UploadFile) => {const imageUrl = file.url || file.thumbUrl || '';setPreviewImage(imageUrl);setPreviewVisible(true);};return (<div><Form><FormItem label="截图" {...formItemLayout}>{getFieldDecorator('upload',{   valuePropName: 'fileList',getValueFromEvent: normFile})(<Uploadaction="/api/image/upload/"data={file => ({image_file: file})}listType="picture-card"fileList={filesList}onPreview={handlePreview}beforeUpload={handleBeforeUpload}onChange={handleChange}>{filesList.length >= 6 ? null : <Button><Icon type="upload"/> Click to upload</Button>}</Upload>)}</FormItem><Modal visible={previewVisible} footer={null} onCancel={handleCancel}><img alt="example" style={{ width: '100%' }} src={previewImage} /></Modal></Form></div>);
};
const ProductForms = Form.create<IProps>()(RegistrationForm);
export default ProductForms;

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

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

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

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

file的打印的结果如下:

    {"uid": "rc-upload-1551084269812-5","width": 600,"height": 354,"lastModified": 1546701318000,"lastModifiedDate": "2019-01-05T15:15:18.000Z","name": "e30e7b9680634b2c888c8bb513cc595d.jpg","size": 31731,"type": "image/jpeg","percent": 100,"originFileObj": {"uid": "rc-upload-1551084269812-5","width": 600,"height": 354},"status": "done","thumbUrl": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAHQ9qKKlbimcXrIH9o2vH/AC2T+ddPj98v+9RRWsuhnHdk0ar9qb5R0Pb6VPB/qh9aKKiRr0Irnt/vUDr+NFFJCRqWxJik5Pb+dLJ938aKK06mYSdKKKKBH//Z","response": {"retCode": 0,"imgUrl": "http://qianguyihao.com/opfewfwj098902kpkpkkj976fe.jpg","photoid": 271850}}

fileList 的打印结果:

[{"uid": "rc-upload-1551084269812-3","width": 1000,"height": 667,"lastModified": 1501414799000,"lastModifiedDate": "2017-07-30T11:39:59.000Z","name": "29381f30e924b89914e91b33.jpg","size": 135204,"type": "image/jpeg","percent": 100,"originFileObj": {"uid": "rc-upload-1551084269812-3","width": 1000,"height": 667},"status": "done","thumbUrl": "data:image/jpeg;base64,/E3ju1tlaK1fzJOnHQU3LsLV7HO6Zrk11MZJ7luT0A4FZuRagi9quvzQQ4iuEJ7ZpqTG4djDsPFl2Lg733f8C4q+YhQ8zoYfGSqoMmfwo5huLL0HjiyPDSYPvxRdC1XQvxeLrB8fvl/OnoLmL9vrdvvYS3NGFVe2YsASOh71JfQyrqV2mXLHOcccVSIYEnDyZO9XXB9KYH//Z","response": {"retCode": 0,"msg": "success","imgUrl": "http://qianguyihao.com/hfwpjouiurewnmbhepr689.jpg",}},{"uid": "rc-upload-1551084269812-5","width": 600,"height": 354,"lastModified": 1546701318000,"lastModifiedDate": "2019-01-05T15:15:18.000Z","name": "e30e7b9680634b2c888c8bb513cc595d.jpg","size": 31731,"type": "image/jpeg","percent": 100,"originFileObj": {"uid": "rc-upload-1551084269812-5","width": 600,"height": 354},"status": "done","thumbUrl": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAHQ9qKKlbimcXrIH9o2vH/AC2T+ddPj98v+9RRWsuhnHdk0ar9qb5R0Pb6VPB/qh9aKKiRr0Irnt/vUDr+NFFJCRqWxJik5Pb+dLJ938aKK06mYSdKKKKBH//Z","response": {"retCode": 0,"imgUrl": "http://qianguyihao.com/opfewfwj098902kpkpkkj976fe.jpg","photoid": 271850}}
]

上方的json数据中,需要做的几点解释:

  1. response字段里面的数据,请求后端接口后,后台返回给前端数据,包含了图片中的url链接
  2. status字段里存放的是图片上传的实时状态,包括上传中、上传完成、上传失败。
  3. thumbUrl字段里面存放的是图片的base64编码。

这个base64编码非常非常长。当点击图片预览的时候,其实就是加载的 thumbUrl 这个字段里的资源,难怪浏览器会卡死。

解决办法:在 handleChange方法里,图片上传成功后,将 thumbUrl 字段里面的 base64 编码改为真实的图片url。代码实现如下:

  handleChange = ({ file, fileList }) => {console.log(JSON.stringify(file)); // file 是当前正在上传的 单个 imgconsole.log(JSON.stringify(fileList)); // fileList 是已上传的全部 img 列表// 【重要】将 图片的base64替换为图片的url。 这一行一定不会能少。// 图片上传成功后,fileList数组中的 thumbUrl 中保存的是图片的base64字符串,这种情况,导致的问题是:图片上传成功后,点击图片缩略图,浏览器会会卡死。而下面这行代码,可以解决该bug。fileList.forEach(imgItem => {if (imgItem && imgItem.status == 'done' && imgItem.response && imgItem.response.imgUrl) {imgItem.thumbUrl = imgItem.response.imgUrl;}});setFilesList(ifilList);};

AntDesign Upload组件上传图片相关推荐

  1. vue问题三:element ui的upload组件上传图片成功和移除事件

    element ui的upload组件上传图片成功和移除事件: 登录后获取到后台传的token存到中: sessionStorage.setItem("token",data.ob ...

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

    前言 本次做后台管理系统,采用的是 AntD 框架.涉及到图片的上传,用的是AntD的 upload 组件. 前端做文件上传这个功能,是很有技术难度的.既然框架给我们提供好了,那就直接用呗.结果用的时 ...

  3. element-ui upload组件上传图片时限制图片宽高

    template部分代码,引入upload组件,这里采用自动上传文件 <div class="filesC"> <el-upload ref="file ...

  4. element UI上传图片Upload组件使用 图片转base64和fale文件处理 formdata数据格式的应用

    element UI上传图片Upload组件使用 & 图片转base64和fale文件处理 & formdata数据格式的应用 1.element UI上传图片Upload组件使用 效 ...

  5. upload组件实现图片上传,图片上传,上传图片,上传头像,批量上传图片前后端逻辑

    1.主要使用el-ui的upload组件.代码如下,最主要的就是将上传的文件转化为当前的url显示在页面 主要代码如下,基于vue的: <template><div><e ...

  6. vue实战(1)——解决element-ui中upload组件使用多个时无法绑定对应的元素

    解决element-ui中upload组件使用多个时无法绑定对应的元素 以前写的项目关于图片上传的都是单张或几张图片上传(主要是基于vue的element),图片路径都是固定写的,所以遇见过列表中多个 ...

  7. elementui el-from 怎样显示图片_vue2.0使用weui.js的uploader组件上传图片(兼容移动端)...

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. 最近在使用 vue2.0开 ...

  8. vue element upload组件 file-list的动态绑定

    转载于:https://blog.csdn.net/weixin_44314258/article/details/102487448 (转载并非原创,如有侵权,通知我立马删除) 本文解决,uploa ...

  9. 蚂蚁金服 Ant-design 常用组件和属性整理

    蚂蚁金服 Ant-design 常用组件和属性整理 本文摘录自:AntDesign官网 1. 通用组件 1.1 Buttondisabled - booleanghost - booleanhref ...

  10. 对于 React 结合 Antd 的 Upload 组件实现图片上传

    一. React 结合 Antd 实现图片上传 引入所需相关的组件和文件,代码如下所示: import React, { Component } from 'react' import PropTyp ...

最新文章

  1. MODE —— 输出一个高度和宽度固定的方框(知识点:for循环嵌套for循环)
  2. 14条最佳JS代码编写技巧
  3. 单片机高手必知的三个重要步骤(干货分享)
  4. CF思维联系–CodeForces -224C - Bracket Sequence
  5. 上几个WebAPI就算微服务架构?Too Young!
  6. 简明易懂的c#入门指南_统计假设检验的简明指南
  7. Oracle数据库游标数总结
  8. 图形学之开篇概念及综述
  9. 轻松使用计算机,职称计算机Excel辅导:简单四招让你使用Excel轻松提速
  10. markdown插入图片、音频视频
  11. 计算机管理游戏,网吧游戏管理系统
  12. 关于蓝桥杯竞赛考试的一些信息~
  13. Python: 如何安装 torch 对应的 torchvision 版本?
  14. CentOS 关闭蜂鸣器声音
  15. Mac OS X 通过命令行修改ip地址
  16. HpSocket源码使用
  17. 什么是Google Ads?
  18. 目标检测算法——YOLOv5/YOLOv7改进之结合特征提取网络RFBNet(涨点明显)
  19. CentOS 7 搭建 TinyProxy 代理
  20. Mac系统快速切换不同JDK

热门文章

  1. 宅男福利:Python爬取某站所有漫画(赶紧收藏)
  2. VGG16-keras 优化
  3. 互联网服务器使用ipset 和iptables禁止国外IP访问
  4. 外行也看得懂!了解量子计算的奇迹
  5. YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5
  6. 3dmax渲染出来的图不清晰?
  7. CentOS7更换阿里yum源
  8. 计算机联锁设备的组成及原理,铁路信号计算机联锁系统及技术分析
  9. MFC入门到精通1-创建项目
  10. 高端物理学名词_物理名词大全