前端图片压缩上传
方法一:
https://blog.csdn.net/Weixiaohuai/article/details/105492051
方法二:VUE和React都可以用
版本:
使用方法:
// 引入image-conversion import * as imageConversion from "image-conversion"; //.... // 压缩到200KB,这里的200就是要压缩的大小,可自定义 let files = file; imageConversion.compressAccurately(files, 200).then((res) => { res = new File([res], files.name, { type: res.type, lastModified: Date.now(), }); let formData = new FormData(); formData.append("uploadFile", res); formData.append("code", rowData.code); formData.append("delayStatus", 0); uploadFiles(formData, 1); });
案例:压缩后并转base64
import React, { useState, useEffect } from 'react' import { Button, Modal, Form, Select, Spin, Input, Upload, message } from 'antd'; import { PlusOutlined } from '@ant-design/icons'; import * as imageConversion from "image-conversion";// 引入image-conversion图片压缩插件 import { getValueFromEvent, getBase64 } from "../pubCom" function EidtAreaTranApply(props) { const [qlzxsq_Form] = Form.useForm();//区内转学申请form表单 const [confirmLoading, setConfirmLoading] = useState(false)//提交按钮loading const [fileArr, setFileArr] = useState([]) //文件上传自定义校验 const validatorFn = (_) => { if (fileArr.length <= 0) { return Promise.reject("请选择要上传的附件")//校验结果错误,提示校验信息 } else { return Promise.resolve()//校验结果正确 } } //点击保存申请 const clickSave = async () => { try { const row = await qlzxsq_Form.validateFields();//表单校验 setConfirmLoading(true) console.log("row", row); let baseFiles = []//存储base64的图片数组 if (Array.isArray(row.fj?.fileList)) { let files = [...row.fj?.fileList];//获取表单选择的图片数组 baseFiles = await Promise.all( files.map(item => { return (async () => { let newFile = "" if (item?.size / 1024 / 1024 > 1) { // 压缩到1000KB,这里的1000就是要压缩的大小,可自定义 let res = await imageConversion.compressAccurately(item?.originFileObj, 1000) console.log("压缩后", res); //转base64 newFile = await getBase64(res) } else { newFile = item.thumbUrl } return newFile })() }) ) } let params = { ...row, fj: [...baseFiles] } if (props.isUpdate) {//判断是编辑还是新增 //编辑 params.id = props.editInfo?.id updateTransferApply({ ...params })//编辑申请 } else { //新增 addTransferApply({ ...params })//新增申请 } console.log("上传文件", params); } catch (errInfo) { setConfirmLoading(false) // console.log("errInfo", errInfo); // message.error("提交失败") } } return ( <> <Modal title={<ModalHead title='区内转学申请' />} width="900px" centered maskClosable={false} open={props.isModalOpen || false} onCancel={props.handleCancel} bodyStyle={{ "overflowX": "hidden", "overflowY": "auto" }} // "pzj-overHidden" footer={ <div className='pzj-footerButtonCenter'> <Button className='bottonSpace bottonWidth' onClick={props.handleCancel}>取消</Button> <Button className='bottonWidth' type='primary' onClick={clickSave} loading={confirmLoading}>提交申请</Button> </div> } > {/* 申请信息表单 */} <Form form={qlzxsq_Form} name="qlzxsq-Form" className='qlzxsq-Form'> //................. <Form.Item label={<RequireTitle title="附件上传" />} // valuePropName="fj" > <Form.Item noStyle name="fj" rules={[ { validator: (_, value, fn) => validatorFn(_, value, fn) }, ]}> <Upload maxCount={3} multiple listType="picture-card" accept="image/*" showUploadList={{ showPreviewIcon: false }} fileList={fileArr} beforeUpload={() => false} onChange={(e) => { if (Array.isArray(e?.fileList)) { setFileArr([...e.fileList]) } else { setFileArr([]) } }} > <div> <PlusOutlined style={{ "fontSize": "24px" }} /> </div> </Upload> </Form.Item> <span>上传转学证明材料(最多3张图片)</span> </Form.Item> </Form> </Modal > </> ); }
pubCom.js--公共方法
//去除首尾空格 export const getValueFromEvent = (e) => { return e.target.value.replace(/(^\s*)|(\s*$)/g, ''); } // 将file文件上传转化为base64进行显示 export const getBase64 = (file) => { return new Promise((resolve, reject) => { ///FileReader类就是专门用来读文件的 const reader = new FileReader() //开始读文件 //readAsDataURL: dataurl它的本质就是图片的二进制数据, 进行base64加密后形成的一个字符串, reader.readAsDataURL(file) // 成功和失败返回对应的信息,reader.result一个base64,可以直接使用 reader.onload = () => resolve(reader.result) // 失败返回失败的信息 reader.onerror = error => reject(error) }) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律