JS前端图片压缩上传-纯js

news/2024/10/25 7:19:55/

JS前端图片压缩上传-纯js

最近在做一个手机端的图片上传,写了一个比较符合自己要求的方法,可供参考

在做这个功能模块时,我遇到了以下问题,都花费了大量时间:

1. 不知道怎么压缩图片,(代码和方法)
2. 得到图片压缩后的base64值,也可以预览,但却传不到后端去
3. 怎么确保我想要压缩的所有图片,大小都相近,图片还尽可能的清晰
(如我参考了网上的代码,基本都是按照比例压缩如1/2或1/4,那一个10m的图片压缩完后还有5m或者2.5m,意义不大,那你说比例调大些,按照1/10比例压缩,这样万一我上传的文件只有200k,这样一压缩图片就严重失真了)
4. 将文件发送到后端时携带参数问题

纯js版本,只引入了一个jq,所有上传的图片都会被压缩到1M左右,小伙伴们可以根据自己的需要再微调参数,以确保压缩后的图片大小符合自己的预期

实例代码如下:

<%--Created by IntelliJ IDEA.User: ASUSDate: 2021/2/24author: xumzTo change this template use File | Settings | File Templates.搬运请备注
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><!-- meta使用viewport以确保页面可自由缩放 --><meta name="viewport"content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no"/><title>身份验证</title><%--引用jQuery和layui框架,如不用layui框架注释掉相应的样式即可,影响的只有界面--%><script src="js/jquery-1.11.0.js"></script><style type="text/css">.up_img_showborder {border: 1px rgba(143, 143, 143, 0.43) dashed;width: 85%;height: 165px;margin: 25px;}#img_one {border: 1px #F2F2F2 solid;max-width: 96%;max-height: 160px;/*padding: 4px;*/}</style></head><body><div style="width: 90%;height: 100%;margin: auto;" align="center"><span>建议传送1M以上的图片进行测试,会有明显的效果,所有的图片都会被压缩在1M以内</span><div id="upload_img01" class="up_img_showborder"><div id="hiden_one"><svg t="1614166231165" class="icon" viewBox="0 0 1027 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1748" width="60" height="60"><path d="M853.95951925 475.5066105h-310.08967642v-300.83326917c0-13.88461268-13.88461268-32.39742862-32.39742936-32.39742862-18.51281666 0-32.39742862 18.51281666-32.39742861 37.02563333v300.83326844H178.2417157c-18.51281666-4.62820399-37.02563333 13.88461268-37.02563262 32.39742934s18.51281666 32.39742862 32.39742863 32.39742861h300.83326916v300.83326845c4.62820399 18.51281666 18.51281666 37.02563333 37.02563261 37.02563334s32.39742862-18.51281666 32.39742935-32.39742862v-305.46147317h305.46147243c18.51281666 0 32.39742862-18.51281666 32.39742934-32.39742861s-9.25640796-37.02563333-27.76922535-37.02563333z" fill="#bfbfbf" p-id="1749"></path></svg><p style="color: gray">点击上传图片</p></div><div id="uploadDemoView"><img  id="img_one"></div></div><div><input type="button"  onclick="next_btn(this)" value="确认"></div><div><input type="file" style="visibility: hidden" accept="image/*" id="btn1"></div></div><script type="text/javascript">$(function () {$("#uploadDemoView").hide();   //});/*点击上传正面图片*/$(document).on('click', '#upload_img01', function () {document.getElementById("btn1").click();});var BlobDealImg = null;/*input数据改变时,获取文件数据,上传正面*/$("#btn1").change(function () {console.log("压缩前的数据大小(1M=1024*1024):"+this.files[0].size);let up_ImgBase64 = this.files[0];	//获取文件对象if (null != up_ImgBase64 && up_ImgBase64 != "") {alert("图像采集成功!");var reader = new FileReader();reader.readAsDataURL(up_ImgBase64);	//将读取的文件转换成base64格式reader.onload = function (e) {var dataBase64 = e.target.result; //result是你读取到的文件内容,此属性读取完成才能使用// console.log('dataBase64==='+dataBase64);dealImage(dataBase64);setTimeout(function () {console.log("压缩后的数据大小(1M=1024*1024)="+BlobDealImg.size);// console.log("转成blob文件后:"+BlobDealImg);console.log(BlobDealImg);}, 50);}} else {alert('图像采集失败,请重新采集!');}});function dealImage(base) {let image = new Image();   //设置一个imageimage.src = base;  //动态加载image.onload = function () {   let canvas = document.createElement('canvas'), //创建一个canvas元素context = canvas.getContext('2d'),    originWidth = image.width,/* 图片的宽度 */originHeight = image.height, /* 图片的高度 */data = '';    //存储压缩后的图片// 设置最大尺寸限制,将所有图片都压缩到小于1mconst maxWidth = 1024, maxHeight = 1024;// 需要压缩的目标尺寸let targetWidth = originWidth, targetHeight = originHeight;// 等比例计算超过最大限制时缩放后的图片尺寸if (originWidth > maxWidth || originHeight > maxHeight) {if (originWidth / originHeight > 1) {// 宽图片targetWidth = maxWidth;targetHeight = Math.round(maxWidth * (originHeight / originWidth));} else {// 高图片targetHeight = maxHeight;targetWidth = Math.round(maxHeight * (originWidth / originHeight));}}canvas.width = targetWidth;   canvas.height = targetHeight;   //设置绘图的高度context.drawImage(image, 0, 0, targetWidth, targetHeight);//使用toDataURL将canvas上的图片转换为base64格式data = canvas.toDataURL('image/jpg');$('#hiden_one').hide();//隐藏区域中的icon和文字$('#uploadDemoView').show(); //打开隐藏的image标签document.getElementById('img_one').src = data;//将压缩后的图片显示到页面上的img标签//将base64转为blob文件对象BlobDealImg = convertBase64UrlToBlob(data);// console.log(BlobDealImg);//上传文件携带参数问题解决var formData = new FormData();//这里需要实例化一个FormData来进行文件上传formData.append("file", BlobDealImg, "file_" + Date.parse(new Date()) + ".jpg");formData.append("data2", "12345");formData.append("data1", "023");/* $.ajax({url: '', //改成您自己的上传接口data: formData,type: "post",processData: false,contentType: false,// dataType: "json",success: function (res) {},});*/}};/*将base64转为blob文件对象,再上传*/function convertBase64UrlToBlob(urlData) {var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);while (n--) {u8arr[n] = bstr.charCodeAt(n);}return new Blob([u8arr], {type: mime});}</script>
</body>
</html>

运行界面如下:
在这里插入图片描述

在这里插入图片描述

关于文件上传的后端Java操作,你还可以参考以下连接:

文件上传从web到Java (https://blog.csdn.net/bug_producter/article/details/115710630)

创作不易,如果这篇文章能够帮助到你,希望能关注或收藏一下博主,如果文章内容有问题也可留言讨论,我们一起学习,一起进步!!


http://www.ppmy.cn/news/170937.html

相关文章

Dell H300/6i/6iR/H700/H800阵列卡配置(转)

说明&#xff1a;其实Dell系列的阵列卡基本都是同一个套路和界面&#xff0c;包括操作步骤&#xff0c;不同的是不同的卡性能和支持Raid模式不一样而已。 名称解释&#xff1a; Disk Group&#xff1a;磁盘组&#xff0c;这里相当于是阵列&#xff0c;例如配置了一个RAID5&…

div遮罩层

实现遮盖层&#xff0c;使一部分区域不可点击编辑等。 1.简易遮罩层一&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"width<device-width>,…

css系列----纯 css 实现轮播图(手动)

2、纯 css 实现轮播图(手动) 实现原理&#xff1a;利用 css3 中 input:checked 和 &#xff5e;选择器实现 /* 设置容器大小*/ .container {position: relative;width: 800px;height: 300px; } /* 设置input位置 */ .container input {position: absolute;z-index: 23;botto…

DEF解析

DEF 全称Design Exchange Format, 用于电路物理信息交互&#xff0c;是将数字实现前后端连接起来的桥梁。目前常用的DEF version 是5.8, 在DEF 中可以定义如下信息&#xff0c;本文不解析每一部分的含义&#xff0c;只概述做物理综合需要的部分信息。DEF file 有如下限定&#…

H323——H239演示功能

1. 概述 H239在ITU文档中实际命名为Role management and additional media channels for ITU-T H.300-series terminals&#xff0c;意为H300系列中断的角色管理和额外没媒体流&#xff0c;H239是H323中用来开启辅流的信令流程规范&#xff0c;会为相关的媒体流添加角色&#…

css系列----纯 css 实现轮播图(自动)

3、纯 css 实现轮播图(自动) 实现原理&#xff1a;利用 css3 中 动画和 overflow:hidden 实现 /* 容器大小 */ .container {height: 300px;width: 800px;overflow: hidden; }/* .wrap */ .wrap {position: relative;left: 0px;width: 2400px;animation: animateImg ease 5s i…

虹科分享 | 近距离接触最新的3个勒索软件

上一期内容为大家讲解了遇到勒索软件时支付或不支付赎金的利弊&#xff0c;以及如何利用Datalocker的产品来防止基于USB的威胁进入你的网络。本期小编将带大家了解当今最新的3个勒索软件&#xff0c;以及Datalocker是如何在这之中起到作用的。了解更多内容&#xff0c;敬请阅读…

虹科分享 | 数据泄露的剖析

数据泄露的剖析 数据泄露是什么&#xff0c;当你发现它们时该怎么做&#xff1f; 可以说&#xff0c;在过去的24个月里&#xff0c;没有哪个词比 "数据泄露 "这个词更能主宰科技界了。在过去的两年里&#xff0c;网络安全事故的头条新闻已经饱和&#xff0c;从影响…