写给大忙人看的 - Java中图片压缩上传至MinIO服务器(4)

简介: 之前文章已经介绍了 MinIO 的环境搭建,已经对文件的上传下载方法,本篇文章一起与大家来学习图片压缩上传的方法

之前文章已经介绍了 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");
    }
    // 拿到文件后缀名,例如:png
    String 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);
        // 转为 MultipartFile
        MultipartFile 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 对图片的处理支持全面,缩放,裁剪等
目录
相关文章
|
3月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
112 9
|
4月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
158 1
|
4月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
148 4
|
4月前
|
Java Shell Maven
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
Flink-11 Flink Java 3分钟上手 打包Flink 提交任务至服务器执行 JobSubmit Maven打包Ja配置 maven-shade-plugin
206 4
|
2天前
|
存储 机器学习/深度学习 人工智能
2025年阿里云GPU服务器租用价格、选型策略与应用场景详解
随着AI与高性能计算需求的增长,阿里云提供了多种GPU实例,如NVIDIA V100、A10、T4等,适配不同场景。2025年重点实例中,V100实例GN6v单月3830元起,适合大规模训练;A10实例GN7i单月3213.99元起,适用于混合负载。计费模式有按量付费和包年包月,后者成本更低。针对AI训练、图形渲染及轻量级推理等场景,推荐不同配置以优化成本和性能。阿里云还提供抢占式实例、ESSD云盘等资源优化策略,支持eRDMA网络加速和倚天ARM架构,助力企业在2025年实现智能计算的效率与成本最优平衡。 (该简介为原文内容的高度概括,符合要求的字符限制。)
|
3天前
|
存储 弹性计算 人工智能
2025年阿里云企业云服务器ECS选购与配置全攻略
本文介绍了阿里云服务器的核心配置选择方法论,涵盖算力需求分析、网络与存储设计、地域部署策略三大维度。针对不同业务场景,如初创企业官网和AI模型训练平台,提供了具体配置方案。同时,详细讲解了购买操作指南及长期运维优化建议,帮助用户快速实现业务上云并确保高效运行。访问阿里云官方资源聚合平台可获取更多最新产品动态和技术支持。
|
6天前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
Node.js 是一种高效的 JavaScript 运行环境,基于 Chrome V8 引擎,支持在服务器端运行 JavaScript 代码。本文介绍如何在阿里云上一键部署 Node.js 环境,无需繁琐配置,轻松上手。前提条件包括 ECS 实例运行中且操作系统为 CentOS、Ubuntu 等。功能特点为一键安装和稳定性好,支持常用 LTS 版本。安装步骤简单:登录阿里云控制台,选择扩展程序管理页面,安装 Node.js 扩展,选择实例和版本,等待创建完成并验证安装成功。通过阿里云的公共扩展,初学者和经验丰富的开发者都能快速进入开发状态,开启高效开发之旅。
|
1月前
|
弹性计算 数据挖掘 应用服务中间件
阿里云轻量应用服务器68元与云服务器99元和199元区别及选择参考
目前阿里云有三款特惠云服务器,第一款轻量云服务器2核2G68元一年,第二款经济型云服务器2核2G3M带宽99元1年,第三款通用算力型2核4G5M带宽199元一年。有的新手用户并不是很清楚他们之间的区别,因此不知道如何选择。本文来介绍一下它们之间的区别以及选择参考。
519 87
|
8天前
|
弹性计算 JavaScript 前端开发
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
一键安装!阿里云新功能部署Nodejs环境到ECS竟然如此简单!
|
2天前
|
存储 人工智能 弹性计算
2025年阿里云企业高性能云服务器租用价格与选型详解
随着企业数字化转型,阿里云于2025年推出多款高性能云服务器实例,涵盖计算、通用和内存密集型场景。文章分析了企业选择云服务器的核心要点,包括明确业务需求(如计算密集型任务推荐计算型实例)、性能与架构升级(如第八代实例性能提升20%),以及第九代实例支持AI等高算力需求。同时提供了配置价格参考和成本优化策略,助力企业实现效率与成本的最优平衡。

热门文章

最新文章