之前文章已经介绍了 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)相关推荐

  1. 【读书笔记】《写给大忙人看的Java SE 8》——Java8新特性总结

    2019独角兽企业重金招聘Python工程师标准>>> 阅读目录 接口中的默认方法和静态方法 函数式接口和Lambda表达式 Stream API 新的日期和时间 API 杂项改进 ...

  2. 与时俱进的Java——《写给大忙人看的Java核心技术》读后感

    作为一个Android工程师,对书中那一句"成也框架,败也框架"深有同感:刚入门的时候只需要用Picasso或者OKHttp等开源框架实现简单的功能就能得到一个结果,有了经验之后才 ...

  3. java语言 文件上传,java中实现文件上传的方法

    java中实现文件上传的方法 发布时间:2020-06-19 10:29:11 来源:亿速云 阅读:86 作者:Leah 这篇文章给大家分享的是java中实现文件上传的方法,相信大部分人都还没学会这个 ...

  4. JS 图片压缩上传并在iOS中矫正方向

    JS 图片压缩上传并在iOS中矫正方向 最近在项目中,用到图片上传.如果不进行压缩再上传的话,动辄34兆的图片,上传起来会相当漫长.还有一点就是,在iOS中所拍摄的图片在本地显示是没有问题的,但是上传 ...

  5. Java实现图片文件上传

    Java实现图片文件上传 Java实现后台图片上传,将上传图片的接口进行分层,便于维护接口. 接口部分(interface) 将接口分为单图片上传以及多图片上传 public interface Fi ...

  6. php中图片文件上传,显示缩略图

    php中图片文件上传,显示缩略图 htm代码块: <meta charset="utf-8" /> <style>img {max-width: 100px ...

  7. JS前端图片压缩上传

    JS前端图片压缩上传重点知识 最近在做一个手机端的图片上传,写了一个比较符合自己要求的方法,可供参考 在做这个功能模块时,我遇到了以下问题,都花费了大量时间: 1. 不知道怎么压缩图片,(代码和方法) ...

  8. android项目中使用的服务器上,android 开发中使用okhttp上传文件到服务器

    开发android手机客户端,常常会需要上传文件到服务器,比如:你手机里的照片. 使用okhttp会是一个很好的选择.它使用很简单,而且运行效率也很高. 首先,在 app/build.gradle 的 ...

  9. web 前端图片优化之--图片压缩上传

    移动前端-图片压缩上传实践  此前有同事跟我聊过关于移动端用canvas压缩图片后再上传的功能,最近有了点空闲时间,所以就实践了一下.demo效果链接在文章底部贴出. 在做移动端图片上传的时候,用户传 ...

最新文章

  1. php对接支付宝当面付对接,支付宝开放平台当面付对接网站
  2. MATLAB应用实战系列(七十六)-【仿真应用】卡尔曼滤波在雷达目标跟踪中的应用仿真(附matlab代码)
  3. 一文带你了解MySQL基础
  4. Class 类文件结构
  5. scala中_*的作用
  6. 数据库编程1 Oracle 过滤 函数 分组 外连接 自连接
  7. nodjes 支付宝接口 - 优惠卷
  8. 转:Cocoa Runtime系统知识整理
  9. 关于未能启用约束。一行或多行中包含违反非空、唯一或外键约束的值的解决方法...
  10. 嘉年华回顾丨杜小勇教授带你解密One Size Does not Fit All?
  11. 用Arduino剖析PWM脉宽调制
  12. SpringBoot集成Swagger2自动生成友好的RestApi测试页面及文档
  13. noip模拟赛 寻宝之后
  14. nodeJS---URL相关模块用法(url和querystring)
  15. 【车牌识别】基于matlab GUI RGB颜色模型车牌识别【含Matlab源码 888期】
  16. 如何复制PDF文件中的文本和图片?
  17. Android keystore 证书文件制作
  18. 常用的数据库增删改查语句
  19. 北航计算机学院本科优秀毕业论文,北航本科毕业论文
  20. python计算现场得分_如何使用Python(scikitlearn)计算factorananalysis得分?

热门文章

  1. 来自一个入行三年半的大数据练习生自述
  2. 坐拥千万用户,覆盖百余行业,脉脉却挣扎在“塔西佗陷阱”
  3. BigDecimal比较建议用compareTo
  4. 被特殊物种序列虚晃一枪的日子
  5. firewalld防火墙
  6. AF---下一代防火墙
  7. 总结之CSIG-MIIP 2017
  8. 南京协同计算机信息网络,南京信息工程大学主页平台管理系统 Yu Xue--Home-- 求解大规模复杂优化问题的合作协同进化算法研究...
  9. 探讨标准的采购外协“Subcontract”流程(一)
  10. VScode加背景图(工作区及全局)