当前位置: 首页 > news >正文

JS(react)图片压缩+图片上传

上传dome

                     var fileNodeTakeStock: any = createRef();<inputref={fileNodeTakeStock}onChange={showPictureTakeStock}style={{ display: "none" }}id="fileInpBtn"type="file"accept="image/*"  //限制上传格式multiple={false}capture="environment" //ios有效调用后置摄像头,use后置/><divclassName={style.upImg}onClick={() => onOpenFileChooserTakeStock()}>点击上传</div>

上传文件

  /** 触发上传 */const onOpenFileChooserTakeStock = () => {if (!!fileNodeTakeStock) fileNodeTakeStock.current.click();};/**上传图片*/const showPictureTakeStock = (e: any) => {getImg(e.target, 0.7).then(({ data, file }) => {const formData = new FormData();let data2 = dataURLtoFile(data);let fileFormat = convertBlobToFile(data2);console.log("文件大小", (file as any).size, fileFormat.size,'base64大小',getImgSize(data));//如果原图小于压缩后的就长传压缩图if (fileFormat.size < (file as any).size) {formData.append("file", fileFormat);} else {formData.append("file", file);}uploadImgFile(formData).then((res) => {if (res?.statusCode === NetState.Ok) {const newRecord = {name: res.data.FrName,filePath: res.data.FrPath,};setImgList((e) => [...e, newRecord]);} else {return Promise.reject(res?.message || "上传失败\n网络出错");}}).catch((error) => {Toast.show(error?.message || "上传失败\n网络出错");});});};/**base64字符串转为blob对象 */const dataURLtoFile = (base64: any) => {let binary = atob(base64.split(",")[1]);let array = [];for (let i = 0; i < binary.length; i++) {array.push(binary.charCodeAt(i));}return new Blob([new Uint8Array(array)], {type: "image/png",});};/**blob对象转为file对象 */const convertBlobToFile = (blob: any) => {// 创建File对象const file = new File([blob], "test.jpg", { type: blob.type });return file;};// base64图片大小const getImgSize = (base64url: any) => {//获取base64图片大小,var str = base64url.replace("data:image/jpeg;base64,", ""); //这里根据自己上传图片的格式进行相应修改var strLength: any = str.length;// base64编码方式,计算// 计算后得到的文件流大小,单位为字节//理解一下base64的编码方式,是把3个8字节编码成4个6字节,到这一步字节数是不变的//但它还要在6个字节添加两个高位组成4个8字节,base64有多少个8字节,就比原来多2倍的多少个8字节,//也就是base64长度要比原码长度多了(base64长度/8)*2个字节,换算过来就是要减掉var fileLength = parseInt((strLength - (strLength / 8) * 2).toString());// 由字节转换为Kbvar size = "";size = (fileLength / 1024).toFixed(2);return parseInt(size);};

压缩图片

getImg(imgFile,quality=0.92) {return new Promise((resolve) => {const file = imgFile.files[0];const reader = new FileReader();reader.readAsDataURL(file);reader.onload = function (e) {const image = new Image(); // 新建一个img标签(还没嵌入DOM节点)image.src = e.target.result;image.onload = function () {const canvas = document.createElement('canvas');const context = canvas.getContext('2d');const imageWidth = image.width / 2;const imageHeight = image.height / 2;canvas.width = imageWidth;canvas.height = imageHeight;context.drawImage(image, 0, 0, imageWidth, imageHeight);//'image/jpeg':图片格式,默认为 image/png,可以是其他image/jpeg等//quality:0到1之间的取值,主要用来选定图片的质量,默认值是0.92,超出范围也会选择默认值const data = canvas.toDataURL('image/jpeg',quality);//data-压缩后base64,后面转blob对象, file-源文件resolve({ data, file });};};});
}

在这里插入图片描述

http://www.lryc.cn/news/294140.html

相关文章:

  • WPF DispatcherTimer用法
  • 【网络安全实验】snort实现高级IDS
  • 19.HarmonyOS App(JAVA)依赖布局DependentLayout使用方法
  • 玩家笔记:幻兽帕鲁搭建服务器开服教程
  • Liunx基本指令
  • 面试题:Redis 分布式锁存在什么问题 ?如何解决 ?
  • Container 命令ctr、crictl 命令
  • 设计模式——七大原则
  • 笔记本电脑的WIFI模块,突然不显示了,网络也连接不上
  • Pytest 与allure测试报告集成
  • MySQL 表的增删改查(基础)
  • 【PDF.js】发票PDF不显示文本的问题
  • C#中检查空值的最佳实践
  • 三层交换组网实验(华为)
  • Android配置GitLab CI/CD持续集成,Shell版本的gitlab-runner,FastLane执行,上传蒲公英
  • 算法提升——LeetCode383场周赛总结
  • (delphi11最新学习资料) Object Pascal 学习笔记---第4章第2.1节( 带结果的Exit例程)
  • vuecli3 执行 npm run build 打包命令报错:TypeError: file.split is not a function
  • 【Java 数据结构】对象的比较
  • 2024 Google Chrome 浏览器回退安装旧版本
  • 将数组中的各字符串都调整为指定长度调整原则:多删(删右侧多出的)少补(左侧补数字0)numpy.char.zfill()
  • 算法题目题单——图论
  • Maven提示Failure to find com.oracle:ojdbc14:jar:10.2.0.4.0
  • 深度学习的数据集制作、标注、处理相关软件
  • 点击按钮打开自定义iframe弹窗
  • LeetCode977 有序数组的平方
  • Windows自动化实现:系统通知和任务栏图标自定义
  • Spring | Spring的“数据库开发“ (Srping JDBC)
  • 面试八股文(2)
  • 记elasticsearch CPU负载100%问题