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.hqwc.cn/news/452599.html

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

相关文章

ShardingSphere 5.x 系列【1】专栏导读

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 背景2. 简介3. 适用人群4. 环境…

代码随想录算法训练营|day24

第七章 回溯算法 77.组合代码随想录文章详解总结 77.组合 以n5,k3为例 (1)for循环遍历&#xff0c;递归选择符合要求的值加入path&#xff0c;len(path)k时&#xff0c;返回 statrtIndex保证每次递归取到的值不重复 剪枝&#xff1a;i<n-(k-len(path))1 后续需要k-len(pat…

n-皇后问题(DFS)

题目 n−皇后问题是指将n个皇后放在nn的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数n&#xff0c;请你输出所有的满足条件的棋子摆法。 输入格式&#xff1a; 共一行&#xff0c;包含…

算法设计与分析实验:回溯

目录 一、组合总和 1.1 具体思路 1.2 思路展示 1.3 代码实现 1.4 复杂度分析 1.5 运行结果 二、全排列 2.1 具体思路 2.2 思路展示 2.3 代码实现 2.4 复杂度分析 2.5 运行结果 三、N皇后问题 3.1 具体思路 3.2 思路展示 3.3 代码实现 3.4 复杂度分析 3.5 运行…

WorkPlus助力企业构建高效沟通与协作的即时通讯平台

在信息高度交流的时代中&#xff0c;即时沟通和高效协作成为企业取得成功的关键因素。而即时通讯平台作为实现即时沟通和快速协作的基础工具&#xff0c;WorkPlus以其创新的设计和优质的服务&#xff0c;助力企业提升沟通效率和协作能力&#xff0c;促进创新与发展。 为何选择W…

【Chrono Engine学习总结】1-安装配置与程序运行

本文仅用于个人安装记录。 官方安装教程 https://api.projectchrono.org/8.0.0/tutorial_install_chrono.html Windows下安装 windows下安装就按照教程好了。采用cmake-gui进行配置&#xff0c;建议首次安装只安装核心模块。然后依此configure下irrlicht&#xff0c;sensor…

Zookeeper服务注册与发现实战

目录 设计思路 Zookeeper注册中心的优缺点 SpringCloudZookeeper实现微服务注册中心 第一步&#xff1a;在父pom文件中指定Spring Cloud版本 第二步&#xff1a;微服务pom文件中引入Spring Cloud Zookeeper注册中心依赖 第三步&#xff1a; 微服务配置文件application.y…

牛客寒假训练营H题

思路&#xff1a;找出所有m的子集&#xff0c;加到价值中&#xff0c;找出最大价值即可。 代码&#xff1a; void solve(){int n, m;cin >> n >> m;vector<pii>a(n 1);for(int i 1;i < n;i )cin >> a[i].first >> a[i].second;int ans 0…

力扣 121. 买卖股票的最佳时机

题目来源&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 好久没写代码了&#xff0c;啥啥都忘了 C题解1&#xff1a;贪心算法。&#xff08;来源代码随想录&#xff09; 因为股票就买卖一次&#xff0c;那么贪心的想法很自然就是取…

基于Springboot的校园失物招领网站(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园失物招领网站&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

共享网盘系统PHP源码

新V5.0版本&#xff0c;支持上传视频、支持视频播放、支持共享&#xff0c;也可以自己用。 可以自动生成视频外链&#xff0c;下载地址&#xff0c;播放器代码&#xff0c;html代码&#xff0c;ubb代码等等。 使用方法&#xff1a; 源码上传到服务器&#xff0c;打开网站根据…

032-安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

032-安全开发-JavaEE应用&Servlet路由技术&JDBC&Mybatis数据库&生命周期 #知识点&#xff1a; 1、JavaEE-HTTP-Servlet技术 2、JavaEE-数据库-JDBC&Mybatis 演示案例&#xff1a; ➢JavaEE-HTTP-Servlet&路由&周期 ➢JavaEE-数据库-JDBC&Mybat…