本人是刚毕业的新手,最近公司的一个项目,前后端分离,前端Vue,后端使用spring boot。其中有一个需求是需要做前端上传的图片需要压缩才能上传。为此在网上查找资料,并做了简单的实现。

那么一步来

一。前端

1.先写界面,考虑到时间问题,就先写个简单的页面,创建个Imagepress.vue

 <template>
<div>
<input id="inputele" type="file" accept="image/*" @change="readImg">
<canvas id="canvasImg" ></canvas>
</div>
</template>

2.当用户点击,上传图片时,触发change事件,调用readImg方法。readImg方法如下:

 readImg: function(e){
let that=this
console.log('123')
let file = e.target.files[0]
let reader = new FileReader()
let img = new Image()
reader.readAsDataURL(file)
//console.log(file) let canvas = document.getElementById('canvasImg');
let context = canvas.getContext('2d');
reader.onload = function(e) {// 文件base64,可以看看结果
img.src = e.target.result;
//console.log('文件base64,可以看看结果'+img.src);
}
img.onload=function(){
let w=this.width,h=this.height
let width=w,height=h
let size=400
if (w>=h&&w>size) {//宽>高
width=size
height=size/w*h
} else if (w<h&&h>size) {
height=size
width=size/h*w
}
let canvas = document.getElementById('canvasImg');
let context = canvas.getContext('2d'); //计算画布的大小
canvas.width=width
canvas.height=height
context.clearRect(0,0,width,height)
//img重新画到特定大小的画布上
context.drawImage(img,0,0,width,height)
//画完之后的互补就是压缩之后的图片canvas
//缩略图canvas转为二进制的数据用于上次
// canvas.toBlob(function(blob){
// console.log('哈哈,开始上传压缩的图片了')
// console.log(blob)
// that.$http.post('http://127.0.0.1:8088/index',blob)
// })
let newData=canvas.toDataURL("image/png",0.3)
console.log(typeof(newData))
let files=new Array()
files.push(newData)
that.$http.post('http://localhost:8088/index',files)
}
}

a.首先是fileReader 读取上传上来的图片file,

b.计算canvas画布的大小,将读取的img重新画到特定到校的画布上

c.最后调用cavas.toDataURL("image/png",0.3)进行压缩,该方法有2个参数,第一个是指定图片的格式,第二个参数是指定压缩图片的质量,取值在0-1之间,返回值是一个 data URI 的DOMString。

页面效果

按F12打开开发者工具

可以看到已经向后台发起请求了。

二。后端

  

后端我是使用的是spring boot,至于spring boot的细节在这里就不赘述了。

在前端我们请求的地址是http://localhost:8088/index

所以后台代码

@RequestMapping(value="/index",method=RequestMethod.POST)

public String uploadimg(@RequestBody String[] files) throws Exception{

}

具体代码如下

 @RequestMapping(value="/index",method=RequestMethod.POST)
public String uploadimg(@RequestBody String[] files) throws Exception{ if(files==null||files.length==0)
return null;
String data="";
String dataprefix=""; for(String file:files){
String[] str=file.split("base64,");
if(str==null||str.length!=2)
return null;
dataprefix=str[0];
data=str[1];
String suffix = "";
if("data:image/jpeg;".equalsIgnoreCase(dataprefix)){//data:image/jpeg;base64,base64编码的jpeg图片数据
suffix = ".jpg";
} else if("data:image/x-icon;".equalsIgnoreCase(dataprefix)){//data:image/x-icon;base64,base64编码的icon图片数据
suffix = ".ico";
} else if("data:image/gif;".equalsIgnoreCase(dataprefix)){//data:image/gif;base64,base64编码的gif图片数据
suffix = ".gif";
} else if("data:image/png;".equalsIgnoreCase(dataprefix)){//data:image/png;base64,base64编码的png图片数据
suffix = ".png";
}else{
throw new Exception("上传图片格式不合法");
} //因为BASE64Decoder的jar问题,此处使用spring框架提供的工具包
byte[] bs = Base64Utils.decodeFromString(data);
//FileUtils.writeByteArrayToFile(new File(savepath+System.currentTimeMillis()+suffix), bs);
FileOutputStream out=new FileOutputStream(new File(savepath+System.currentTimeMillis()+suffix));
out.write(bs);
out.flush();
out.close();
}
return "开始上传图片";
}

具体图片的保存地址我配置在了application.yml中,具体如下

server:
port: 8088

savepath: E:/images/

发现压缩的图片也保存好了,查看图片的大小,发现图片确实变小了。

现在基本完成图片的压缩上传。在手机端也是没有问题的。

作为刚毕业没毕业多久的人,肯定还有不足,若有不足请各位大佬多多提醒。这是第一篇博客,也请各位多多留言。

基于前台vue,后台是spring boot的压缩图片上传的更多相关文章

  1. Vue页面内公共的多类型附件图片上传区域并适用折叠面板

    在前端项目中,附件上传是很常用的功能,几乎所有的app相关项目中都会使用到,一般在选择使用某个前端UI框架时,可以查找其内封装好的图片上传组件,但某些情况下可能并不适用于自身的项目需求,本文中实现的附 ...

  2. SpringMVC+Spring+MyBatis 整合与图片上传简单示例

    一.思路: (一) Dao层: 1. SqlMapConfig.xml,空文件即可.需要文件头.2. applicationContext_dao.xml. a) 数据库连接池b) SqlSessio ...

  3. Spring Boot 嵌入式 Tomcat 文件上传、url 映射虚拟路径

    1.Java web 应用开发完成后如果是导入外置的 Tomcat 的 webapps 目录的话,那么上传的文件可以直接的放在应用的 web 目录下去就好了,浏览器可以很方便的进行访问. 2.Spri ...

  4. spring boot实现切割分片上传

    文件上传是web开发中经常会遇到的 springboot的默认配置为10MB,大于10M的是传不上服务器的,需要修改默认配置 但是如果修改支持大文件又会增加服务器的负担. 当文件大于一定程度时,不仅服 ...

  5. 解决使用Spring Boot、Multipartfile实现上传提示无法找到文件的问题

    前言 SpringBoot使用MultiPartFile接收来自表单的file文件,然后进行服务器的上传是一个项目最基本的需求,我以前的项目都是基于SpringMVC框架搭建的,所以在使用Spring ...

  6. Spring Boot + thymeleaf 实现文件上传下载

    参考博客:https://juejin.im/post/5a326dcaf265da431048685e 技术选型:spring boot 2.1.1+thymeleaf+maven 码云地址:htt ...

  7. Spring Boot入门——多文件上传大小超限问题解决

    多文件上传中遇到上传文件大小的问题 org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededExcepti ...

  8. spring boot 长时间运行上传报临时目录找不到

    The temporary upload location [/tmp/tomcat-docbase.3752410576653354473.8899/work/Tomcat/localhost/RO ...

  9. MUI + Spring MVC 实现多图片上传

    后台代码,主要是SpringMVC 接收多文件上传,不是用的MutilFiles 方式,主要是因为MUI 5+ 不支持文件上传的Key是同一个名字 private String saveFile(Mu ...

随机推荐

  1. 爬虫模块介绍--selenium (浏览器自动化测试工具,模拟可以调用浏览器模拟人操作浏览器)

    selenium主要的用途就是控制浏览器,模仿真人操作浏览器的行为 模块安装:pip3 install selenium 需要控制的浏览器 from selenium import webdriver ...

  2. 几何概型 uva11722

    #include<bits/stdc++.h> using namespace std; int t1,t2,s1,s2,w; int get(int b) { ; int d=s2-s1 ...

  3. centos的nginx如何访问本地共享文件夹的文件 nginx访问404,403问题

    关键挂载 sudo vmhgfs-fuse .host:/musings /home/xxx -o allow_other,uid=0,gid=0

  4. MySQL1-安装

    MySQL 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据 ...

  5. BLE和2.4G实现通信

    1. 背景 客户的项目是无线控制灯具,目前采用2.4G芯片,一端是2.4G遥控器,一端是2.4G灯具.现在客户的需求是在不增加成本的条件下增加手机APP控制.因为BLE芯片一般会比纯2.4G芯片价格高 ...

  6. docker 网络 路由

    通过在Docker宿主机上添加静态路由实现跨宿主机通信 模拟环境 主机1(192.168.58.144) 设置docker0 网关 (172.17.0.1/16)                主机2 ...

  7. CCNet: Criss-Cross Attention for Semantic Segmentation 里的Criss-Cross Attention计算方法

    论文地址:https://arxiv.org/pdf/1811.11721v1.pdf  code address: https://github.com/speedinghzl/CCNet 相关论文 ...

  8. Thing in java 第5章,初始化和清理,练习题答案

    /** * Created by Sandy.Liu on 2018/7/28. * Thinking in java version 4, chapter 5, practice 2 * Creat ...

  9. Visual Studio安装Visual Assist的办法(兼容VS2010至VS2017)

    Visual Assist可以说是一个码代码的高效帮手,有了它,敲起代码速度杠杠的,但是有时候安装破解老是出问题,这一次,我自己尝试了几次,跟着网上的教程做了做,改了改,结合之前安装的经验,最后总算安 ...

  10. 斐讯N1折腾记

    斐讯N1折腾记:运行 Linux 及优化  2018-06-23  37条评论  4,445次阅读  11人点赞 最后更新时间:2019年03月10日 咳咳咳,上篇教程教大家给斐讯 N1 降级并且刷了 ...