Spring Boot 中实现图片文件压缩

server/2025/1/19 0:55:44/

图片文件压缩是 Web 应用中常见的需求,尤其是在处理用户上传或动态生成的图片时。压缩图片不仅可以减少服务器的存储空间,还能大幅提高网页加载速度和用户体验。在本文中,我们将探讨如何在 Spring Boot 中实现图片压缩,并提供接口供用户上传和下载压缩后的图片。

为什么要压缩图片?

  1. 减小文件体积:压缩图片可以显著减小文件大小,节省存储空间,提升加载速度。
  2. 提升加载速度:压缩后的图片加载更快,有助于优化前端性能,特别是在移动设备上。
  3. 降低带宽消耗:减少图片文件的大小,降低客户端和服务器之间的数据传输量,尤其在用户流量较大的情况下。
  4. 提高响应速度:压缩图片后,可以使得图片更快地上传和下载,减少响应时间。

常见的图片压缩格式包括 JPEG、PNG、WEBP 等,本文将介绍如何使用 Java 的图像处理库来实现图片的压缩。

在 Spring Boot 中压缩图片

Spring Boot 并未直接提供图片压缩功能,但我们可以结合一些开源图像处理库来实现。这里我们使用 Thumbnailator,一个轻量级的 Java 图片处理库,它提供了简洁的 API 来进行图片的缩放、压缩等操作。

步骤 1:添加依赖

首先,确保在 pom.xml 中加入 Thumbnailator 依赖。Thumbnailator 是一个非常强大的图像处理库,支持图片压缩、缩放、旋转等操作。

<dependency><groupId>net.coobird</groupId><artifactId>thumbnailator</artifactId><version>0.4.20</version>
</dependency>
步骤 2:创建图片压缩工具类

我们创建一个工具类,用来实现图片压缩功能。Thumbnailator 提供了一个非常简单的 API 来进行图片缩放和压缩。

java">import net.coobird.thumbnailator.Thumbnails;
import java.io.File;
import java.io.IOException;public class ImageUtils {// 压缩图片并保存public static void compressImage(String inputImagePath, String outputImagePath, int width, int height) throws IOException {Thumbnails.of(inputImagePath).size(width, height) // 设置目标图片大小.outputFormat("jpg")  // 设置输出图片格式.toFile(outputImagePath);  // 保存压缩后的图片}// 压缩图片并返回 byte[]public static byte[] compressImageToBytes(String inputImagePath, int width, int height) throws IOException {return Thumbnails.of(inputImagePath).size(width, height).outputFormat("jpg").asBytes();  // 返回字节数组}
}
  • compressImage 方法:该方法接收输入图片路径、输出路径、目标宽度和高度。它将图片压缩并保存为指定的路径。
  • compressImageToBytes 方法:该方法返回压缩后的图片字节数组,可以用于文件下载或者直接发送给客户端。
步骤 3:创建 Spring Boot 控制器提供压缩功能

接下来,我们创建一个 REST 控制器,让用户能够上传图片并获取压缩后的图片。

java">import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.io.*;@RestController
@RequestMapping("/api/images")
public class ImageController {// 图片上传并压缩接口@PostMapping("/upload")public ResponseEntity<String> uploadImage(@RequestParam("file") MultipartFile file,@RequestParam("width") int width,@RequestParam("height") int height) throws IOException {// 获取图片文件并保存String inputFilePath = "uploads/" + file.getOriginalFilename();file.transferTo(new File(inputFilePath));// 压缩图片并保存到目标路径String outputFilePath = "uploads/compressed_" + file.getOriginalFilename();ImageUtils.compressImage(inputFilePath, outputFilePath, width, height);return ResponseEntity.ok("Image uploaded and compressed successfully!");}// 图片下载接口@GetMapping("/download/{filename}")public ResponseEntity<Resource> downloadImage(@PathVariable String filename) throws FileNotFoundException {File file = new File("uploads/compressed_" + filename);if (!file.exists()) {throw new FileNotFoundException("The file does not exist.");}// 使用 FileSystemResource 返回文件Resource resource = new FileSystemResource(file);// 设置响应头以便浏览器下载文件return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"").contentType(MediaType.parseMediaType("image/jpeg")).body(resource);}
}
解释
  1. 上传图片并压缩
    • 接受用户上传的图片文件和压缩后的目标宽度和高度。
    • 使用 ImageUtils.compressImage 方法压缩并保存图片。
  2. 下载压缩后的图片
    • 用户可以通过 GET 请求下载压缩后的图片。返回的图片是通过 FileSystemResource 获取的,Spring 会自动处理文件下载的 HTTP 响应。
步骤 4:配置文件上传目录

为了保存上传的文件,你可以在 application.properties 中配置上传文件的存储目录:

java"># 设置上传文件的目录
spring.servlet.multipart.location=uploads

确保 uploads 文件夹存在,或者你可以在代码中动态创建该目录。


测试功能

  1. 上传图片并压缩

    • 使用 POST 请求,上传图片并设置压缩后的宽度和高度:
    curl -X POST -F "file=@/path/to/your/image.jpg" -F "width=300" -F "height=300" http://localhost:8080/api/images/upload
    
    • 这会将上传的图片压缩为 300x300 的大小,并保存在 uploads/compressed_image.jpg 路径下。
  2. 下载压缩后的图片

    • 使用 GET 请求下载压缩后的图片:
    curl -O http://localhost:8080/api/images/download/compressed_image.jpg
    
    • 这将下载压缩后的图片文件。

优化和改进

  1. 图片格式选择:当前我们默认将图片压缩为 JPEG 格式。如果需要其他格式(如 PNG、WEBP),可以通过 outputFormat 方法进行调整。

    java">// 例1
    Thumbnails.of(inputImagePath).size(width, height).outputFormat("png")  // 可改为 png 或其他格式.toFile(outputImagePath);// 例2
    Thumbnails.of(inputStream).scale(1.0)                 // 保持原始尺寸.outputQuality(0.7)         // 设置压缩质量(0.7 可以根据需要调整).outputFormat("jpg")        // 可指定输出格式.toOutputStream(outputStream);
    
  2. 文件大小限制:可以在 Spring Boot 的配置文件中设置文件上传的大小限制:

    java">spring.servlet.multipart.max-file-size=5MB
    spring.servlet.multipart.max-request-size=5MB
    
  3. 异步处理:对于大图片的上传和压缩过程,可以考虑使用 Spring Boot 的异步处理方式,避免阻塞主线程,提高系统性能。


总结

通过使用 Thumbnailator 库和 Spring Boot 的强大功能,我们能够轻松地处理图片上传和压缩操作。本文介绍了如何实现一个简单的图片上传接口,支持图片的压缩和下载功能。对于实际应用,可以根据需要进行进一步的优化,比如支持多个图片的批量压缩、异步处理、图像格式支持等。


http://www.ppmy.cn/server/159493.html

相关文章

STM32 FreeRTOS 信号量

信号量的简介 reeRTOS中的信号量是一种用于任务间同步和资源管理的机制。信号量可以是二进制的&#xff08;只能取0或1&#xff09;也可以是计数型的&#xff08;可以是任意正整数&#xff09;。信号量的基本操作包括“获取”和“释放”。 比如动车上的卫生间&#xff0c;一个…

STM32 FreeRTOS 的任务挂起与恢复以及查看任务状态

目录 任务的挂起与恢复的API函数 任务挂起函数 任务恢复函数 任务恢复函数&#xff08;中断中恢复&#xff09; 函数说明 注意事项 查看任务状态 任务的挂起与恢复的API函数 vTaskSuspend()&#xff1a;挂起任务, 类似暂停&#xff0c;可恢复 vTaskResume()&#xff1a…

使用jupyter notebook没有正常打开浏览器的几种情况解决

迅速记录前期 1.下载 https://www.anaconda.com/products/individual 2.安装 直接默认安装就行 3.打开jupyter notebook 在开始菜单里面可以找到 4.遇到的问题解决 1.运行jupyter notebook&#xff0c;黑窗口自动关了 每次黑窗口迅速的加载完就自己关掉了 也没有打开新…

NumPy;NumPy在数据分析中的应用;NumPy与其他库的搭配使用

NumPy&#xff1b;NumPy在数据分析中的应用&#xff1b;NumPy与其他库的搭配使用 NumPy&#xff1a;Python 数据分析的核心工具什么是 NumPy&#xff1f;NumPy 的主要优势 NumPy 在数据分析中的应用1. 数据处理与清洗2. 数学和统计分析3. 数组变换与矩阵运算 NumPy 与其他库的搭…

云IDE:开启软件开发的未来篇章

敖行客一直致力于将整个研发协作流程线上化&#xff0c;从而打破物理环境依赖&#xff0c;让研发组织模式更加灵活、自由且高效&#xff0c;今天就来聊聊AT Work&#xff08;一站式研发协作平台&#xff09;的重要组成部分-云IDE。 在科技领域&#xff0c;历史常常是未来的风向…

第一次作业三种方式安装mysql(Windows和linux下)作业

在Windows11上安装sever&#xff08;服务&#xff09;端和客户端 server端安装 打开官网MySQL 进入到主页 点击DOWMLOAD 进入下载界面 点击下方MySQL Community (GPL) Downloads 进入社区版mysql下载界面 点击 MySQL Community Server 进入server端下载 选择8.4.3LTS&…

OpenCV实现彩色图像的直方图均衡化

1、直方图均衡化 在OpenCV中&#xff0c;equalizeHist函数用于直方图均衡化&#xff08;Histogram Equalization&#xff09;。这是一种图像处理技术&#xff0c;旨在增强图像的对比度&#xff0c;特别是在图像的灰度值集中于某个范围时非常有用。通过调整图像的灰度分布&…

大文件上传的解决办法~文件切片、秒传、限制文件并发请求。。。

1、项目背景&#xff1a;针对大文件上传&#xff0c;如果将文件作为一个请求去发送给后端&#xff0c;会有以下几种问题&#xff0c;首先是上传时间长&#xff0c;用户不能进行其他操作&#xff0c;包括页面刷新等操作&#xff0c;其次有的接口会设置响应时间限制&#xff0c;可…