基于SpringBoot实现图片上传并生成缩略图功能

 更新时间:2025年08月17日 11:30:38   作者:火皇405  
在实际开发中,上传图片并生成缩略图是一项常见需求,例如在电商平台、社交应用等场景中,缩略图可以有效提高页面加载速度,优化用户体验,本文将介绍如何在 Spring Boot 项目中实现上传图片并生成缩略图的功能,需要的朋友可以参考下

在实际开发中,上传图片并生成缩略图是一项常见需求,例如在电商平台、社交应用等场景中,缩略图可以有效提高页面加载速度,优化用户体验。本文将介绍如何在 Spring Boot 项目中实现上传图片并生成缩略图的功能。

1. 依赖配置

pom.xml 文件中添加以下依赖:

<!-- Spring Boot Web -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
 
<!-- 文件上传 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
 
<!-- 图片处理依赖 -->
<dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-core</artifactId>
    <version>3.8.1</version>
</dependency>
 
<!-- Apache Commons IO -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

2. 核心代码实现

以下方法将实现图片上传并生成缩略图的功能:

import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;
 
public String uploadPictureThumbnail(String bucketName, MultipartFile multipartFile, Long assocId, String originalStorageName, Integer scale, Integer width, Integer height) {
    String directoryPath = "";
    if (OsUtils.isLinux()) {
        directoryPath = "/tempdir";
    } else if (OsUtils.isWindows()) {
        directoryPath = "C:/tempdir";
    }
 
    File directory = new File(directoryPath);
    if (!directory.exists()) {
        directory.mkdir();
    }
 
    String originalName = multipartFile.getOriginalFilename();
    String suffixName = getSuffixName(originalName, ".", 0);
    String suffix = getSuffixName(originalName, ".", 1);
    String storageName = UUID.randomUUID().toString() + suffixName;
    String storageFileName = null;
 
    List<String> thumbnailSuffixName = Arrays.asList(".png", ".jpg", ".jpeg", ".gif");
    if (thumbnailSuffixName.contains(suffixName.toLowerCase())) {
        try {
            // 保存原始图片
            String originalImagePath = directoryPath + "/" + storageName;
            Path filePath = Paths.get(originalImagePath);
            Files.write(filePath, multipartFile.getBytes());
 
            // 读取原始图片并生成缩略图
            BufferedImage originalImage = ImageIO.read(new File(originalImagePath));
            int originalWidth = originalImage.getWidth();
            int originalHeight = originalImage.getHeight();
 
            // 计算缩略图尺寸
            int[] data = computeSize(originalWidth, originalHeight, scale, width, height);
            int thumbnailWidth = data[0];
            int thumbnailHeight = data[1];
 
            Image scaledImage = originalImage.getScaledInstance(thumbnailWidth, thumbnailHeight, Image.SCALE_SMOOTH);
            BufferedImage thumbnailImage = new BufferedImage(thumbnailWidth, thumbnailHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g2d = thumbnailImage.createGraphics();
            g2d.drawImage(scaledImage, 0, 0, null);
            g2d.dispose();
 
            // 保存缩略图
            String thumbnailPath = directoryPath + "/" + UUID.randomUUID().toString() + suffixName;
            File thumbnailFile = new File(thumbnailPath);
            ImageIO.write(thumbnailImage, suffix.replace(".", ""), thumbnailFile);
 
            // 上传缩略图(这里用自定义 uploadFile 方法上传到对象存储)
            try (FileInputStream in = new FileInputStream(thumbnailFile)) {
                String name = getSuffixName(originalStorageName, "/", 1);
                storageFileName = uploadFile(bucketName, in, multipartFile.getContentType(), assocId, thumbnailFile.length(), name, "thumbnail");
            }
 
            // 清理临时文件
            new File(originalImagePath).delete();
            thumbnailFile.delete();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return storageFileName;
}

3. 计算缩略图尺寸方法

根据原始尺寸、比例、指定宽高生成合适的缩略图尺寸:

private int[] computeSize(int originalWidth, int originalHeight, Integer scale, Integer width, Integer height) {
    if (scale != null && scale > 0) {
        return new int[]{originalWidth * scale / 100, originalHeight * scale / 100};
    } else if (width != null && height != null) {
        return new int[]{width, height};
    } else {
        // 默认缩小为原始尺寸的 50%
        return new int[]{originalWidth / 2, originalHeight / 2};
    }
}

4. 工具方法示例

用于提取文件后缀名:

5. 注意事项

  1. 操作系统临时目录:根据不同操作系统,创建不同的临时文件夹路径。
  2. 文件清理:上传完成后及时删除临时文件,避免占用过多磁盘空间。
  3. 缩略图格式支持:目前支持 PNG、JPG、JPEG、GIF 格式。
  4. 上传逻辑uploadFile 方法需根据具体的存储服务(例如 MinIO、OSS、七牛云等)自定义实现。

6. 总结

通过以上步骤,我们成功实现了图片上传并生成缩略图的功能。此功能不仅能有效减少图片加载时间,还能节省存储空间,提升系统性能。

到此这篇关于基于SpringBoot实现图片上传并生成缩略图功能的文章就介绍到这了,更多相关SpringBoot图片上传并生成缩略图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java后端pageHelper分页实现方法步骤

    java后端pageHelper分页实现方法步骤

    这篇文章主要给大家介绍了关于java后端pageHelper分页实现方法的相关资料,在我们的Java项目中分页是必不可少的数据展示页面,文中通过图文以及示例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • Java实现将PPT转为OFD过程详解

    Java实现将PPT转为OFD过程详解

    本文将通过Java后端程序代码展示如何实现将PPT幻灯片转成OFD格式,文中的示例代码讲解详细,对我们学习或工作有一定的帮助,需要的可以参考一下
    2022-01-01
  • Java策略模式取代if else

    Java策略模式取代if else

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法
    2021-10-10
  • Java线程阻塞和唤醒的几种方式详解

    Java线程阻塞和唤醒的几种方式详解

    这篇文章主要介绍了Java线程阻塞和唤醒的几种方式详解,线程阻塞是指当一个线程无法继续执行时,它会进入阻塞状态,直到某个条件满足后才能继续执行,线程阻塞可以通过多种方式实现,如等待锁、等待IO操作、等待其他线程的完成等,需要的朋友可以参考下
    2023-10-10
  • Java中数组的创建与传参方法(学习小结)

    Java中数组的创建与传参方法(学习小结)

    这篇文章主要介绍了Java中数组的创建与传参方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • JavaWeb实现简单文件上传功能

    JavaWeb实现简单文件上传功能

    这篇文章主要为大家详细介绍了JavaWeb实现简单文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • SpringBoot项目开发常用技术整合

    SpringBoot项目开发常用技术整合

    今天给大家分享springboot项目开发常用技术整合,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-08-08
  • SpringBoot Starter自定义全局加解密组件的详细流程

    SpringBoot Starter自定义全局加解密组件的详细流程

    SpringBoot Starter作用将一组相关的依赖打包,简化项目的配置和初始化过程,通过特定的Starter开发者可以快速的实现特定功能模块的开发和扩展,本文给大家介绍了SpringBoot Starter自定义全局加解密组件的详细流程,需要的朋友可以参考下
    2024-02-02
  • 通过图例了解IDEA引入JQuery实现步骤

    通过图例了解IDEA引入JQuery实现步骤

    这篇文章主要介绍了IDEA引入JQuery实现步骤图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 关于批量插入或更新数据(MyBatis-plus框架)

    关于批量插入或更新数据(MyBatis-plus框架)

    这篇文章主要介绍了关于批量插入或更新数据(MyBatis-plus框架),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09

最新评论