写给大忙人看的 - Java中图片压缩上传至MinIO服务器(4)
之前文章已经介绍了 MinIO 的环境搭建,已经对文件的上传下载方法,本篇文章一起与大家来学习图片压缩上传的方法
1、背景
最近客户总抱怨 APP 中图片显示较慢, 升级服务器带宽又没有多的预算。查看原因,是因为现在大家都是用的智能手机拍照,拍出来的照片小则 2-3 M,大则十几 M,所以导致图片显示较慢。思考再三,决定将图片进行压缩再上传图片服务器来解决图片显示慢的问题
2、开发准备
1、引入 maven 依赖
<!-- 图片压缩 -->
<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.8</version>
</dependency>
本次我们选择了使用 thumbnailator 来作为压缩的工具
2、thumbnailator 简介
- Thumbnailator 是一个用来生成图像缩略图的 Java 类库,通过很简单的代码即可生成图片缩略图,也可直接对一整个目录的图片生成缩略图
- 支持图片缩放,区域裁剪,水印,旋转,保持比例
3、压缩准备
- 判断是否是图片方法
/*** 判断文件是否为图片*/
public boolean isPicture(String imgName) {boolean flag = false;if (StringUtils.isBlank(imgName)) {return false;}String[] arr = {"bmp", "dib", "gif", "jfif", "jpe", "jpeg", "jpg", "png", "tif", "tiff", "ico"};for (String item : arr) {if (item.equals(imgName)) {flag = true;break;}}return flag;
}
3、压缩上传
/*** 上传文件** @param file 文件* @return*/
public JSONObject uploadFile(MultipartFile file) throws Exception {JSONObject res = new JSONObject();res.put("code", 500);// 判断上传文件是否为空if (null == file || 0 == file.getSize()) {res.put("msg", "上传文件不能为空");return res;}// 判断存储桶是否存在if (!client.bucketExists("test")) {client.makeBucket("test");}// 拿到文件后缀名,例如:pngString suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1);// UUID 作为文件名String uuid = String.valueOf(UUID.randomUUID());// 新的文件名String fileName = DateUtils.getYyyymmdd() + "/" + uuid + "." + suffix;/*** 判断是否是图片* 判断是否超过了 100K*/if (isPicture(suffix) && (1024 * 1024 * 0.1) <= file.getSize()) {// 在项目根目录下的 upload 目录中生成临时文件File newFile = new File(ClassUtils.getDefaultClassLoader().getResource("upload").getPath() + uuid + "." + suffix);// 小于 1M 的if ((1024 * 1024 * 0.1) <= file.getSize() && file.getSize() <= (1024 * 1024)) {Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.3f).toFile(newFile);}// 1 - 2M 的else if ((1024 * 1024) < file.getSize() && file.getSize() <= (1024 * 1024 * 2)) {Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.2f).toFile(newFile);}// 2M 以上的else if ((1024 * 1024 * 2) < file.getSize()) {Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.1f).toFile(newFile);}// 获取输入流FileInputStream input = new FileInputStream(newFile);// 转为 MultipartFileMultipartFile multipartFile = new MockMultipartFile("file", newFile.getName(), "text/plain", input);// 开始上传client.putObject("test", fileName, multipartFile.getInputStream(), file.getContentType());// 删除临时文件newFile.delete();// 返回状态以及图片路径res.put("code", 200);res.put("msg", "上传成功");res.put("url", minioProp.getEndpoint() + "/" + "test" + "/" + fileName);}// 不需要压缩,直接上传else {// 开始上传client.putObject("test", fileName, file.getInputStream(), file.getContentType());// 返回状态以及图片路径res.put("code", 200);res.put("msg", "上传成功");res.put("url", minioProp.getEndpoint() + "/" + "test" + "/" + fileName);}return res;
}
- 这里我们判断了当文件为图片的时候,且当它大小超过了 (1024 * 1024 * 0.1),约为 100K 的时候,才进行压缩
- 我们首先在根目录下的 upload 目录中创建了一个临时文件 newFile
- Thumbnails.of(file.getInputStream()).scale(1f).outputQuality(0.3f).toFile(newFile);将压缩后的文件输出到临时文件中
- 然后将 FileInputStream 转为 MultipartFile 上传
- 最后删除临时文件 newFile.delete();
- 完成图片压缩上传
4、测试
- 原图 706K
- 压缩后 120K
5、总结
- 综合以上代码,可以看出 Thumbnails 对图片的处理是很方便的,且代码量也非常少
- 通过测试,可以看出压缩后的图片质量也很高
- thumbnailator 对图片的处理支持全面,缩放,裁剪等
如您在阅读中发现不足,欢迎留言!!!
写给大忙人看的 - Java中图片压缩上传至MinIO服务器(4)相关推荐
- 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结
2019独角兽企业重金招聘Python工程师标准>>> 阅读目录 接口中的默认方法和静态方法 函数式接口和Lambda表达式 Stream API 新的日期和时间 API 杂项改进 ...
- 与时俱进的Java——《写给大忙人看的Java核心技术》读后感
作为一个Android工程师,对书中那一句"成也框架,败也框架"深有同感:刚入门的时候只需要用Picasso或者OKHttp等开源框架实现简单的功能就能得到一个结果,有了经验之后才 ...
- java语言 文件上传,java中实现文件上传的方法
java中实现文件上传的方法 发布时间:2020-06-19 10:29:11 来源:亿速云 阅读:86 作者:Leah 这篇文章给大家分享的是java中实现文件上传的方法,相信大部分人都还没学会这个 ...
- JS 图片压缩上传并在iOS中矫正方向
JS 图片压缩上传并在iOS中矫正方向 最近在项目中,用到图片上传.如果不进行压缩再上传的话,动辄34兆的图片,上传起来会相当漫长.还有一点就是,在iOS中所拍摄的图片在本地显示是没有问题的,但是上传 ...
- Java实现图片文件上传
Java实现图片文件上传 Java实现后台图片上传,将上传图片的接口进行分层,便于维护接口. 接口部分(interface) 将接口分为单图片上传以及多图片上传 public interface Fi ...
- php中图片文件上传,显示缩略图
php中图片文件上传,显示缩略图 htm代码块: <meta charset="utf-8" /> <style>img {max-width: 100px ...
- JS前端图片压缩上传
JS前端图片压缩上传重点知识 最近在做一个手机端的图片上传,写了一个比较符合自己要求的方法,可供参考 在做这个功能模块时,我遇到了以下问题,都花费了大量时间: 1. 不知道怎么压缩图片,(代码和方法) ...
- android项目中使用的服务器上,android 开发中使用okhttp上传文件到服务器
开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片. 使用okhttp会是一个很好的选择.它使用很简单,而且运行效率也很高. 首先,在 app/build.gradle 的 ...
- web 前端图片优化之--图片压缩上传
移动前端-图片压缩上传实践 此前有同事跟我聊过关于移动端用canvas压缩图片后再上传的功能,最近有了点空闲时间,所以就实践了一下.demo效果链接在文章底部贴出. 在做移动端图片上传的时候,用户传 ...
最新文章
- php对接支付宝当面付对接,支付宝开放平台当面付对接网站
- MATLAB应用实战系列(七十六)-【仿真应用】卡尔曼滤波在雷达目标跟踪中的应用仿真(附matlab代码)
- 一文带你了解MySQL基础
- Class 类文件结构
- scala中_*的作用
- 数据库编程1 Oracle 过滤 函数 分组 外连接 自连接
- nodjes 支付宝接口 - 优惠卷
- 转:Cocoa Runtime系统知识整理
- 关于未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值的解决方法...
- 嘉年华回顾丨杜小勇教授带你解密One Size Does not Fit All?
- 用Arduino剖析PWM脉宽调制
- SpringBoot集成Swagger2自动生成友好的RestApi测试页面及文档
- noip模拟赛 寻宝之后
- nodeJS---URL相关模块用法(url和querystring)
- 【车牌识别】基于matlab GUI RGB颜色模型车牌识别【含Matlab源码 888期】
- 如何复制PDF文件中的文本和图片?
- Android keystore 证书文件制作
- 常用的数据库增删改查语句
- 北航计算机学院本科优秀毕业论文,北航本科毕业论文
- python计算现场得分_如何使用Python(scikitlearn)计算factorananalysis得分?
热门文章
- 来自一个入行三年半的大数据练习生自述
- 坐拥千万用户,覆盖百余行业,脉脉却挣扎在“塔西佗陷阱”
- BigDecimal比较建议用compareTo
- 被特殊物种序列虚晃一枪的日子
- firewalld防火墙
- AF---下一代防火墙
- 总结之CSIG-MIIP 2017
- 南京协同计算机信息网络,南京信息工程大学主页平台管理系统 Yu Xue--Home-- 求解大规模复杂优化问题的合作协同进化算法研究...
- 探讨标准的采购外协“Subcontract”流程(一)
- VScode加背景图(工作区及全局)