基于SpringBoot實(shí)現(xiàn)圖片上傳并生成縮略圖功能
在實(shí)際開發(fā)中,上傳圖片并生成縮略圖是一項(xiàng)常見需求,例如在電商平臺、社交應(yīng)用等場景中,縮略圖可以有效提高頁面加載速度,優(yōu)化用戶體驗(yàn)。本文將介紹如何在 Spring Boot 項(xiàng)目中實(shí)現(xiàn)上傳圖片并生成縮略圖的功能。
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. 核心代碼實(shí)現(xiàn)
以下方法將實(shí)現(xiàn)圖片上傳并生成縮略圖的功能:
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();
// 計(jì)算縮略圖尺寸
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. 計(jì)算縮略圖尺寸方法
根據(jù)原始尺寸、比例、指定寬高生成合適的縮略圖尺寸:
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 {
// 默認(rèn)縮小為原始尺寸的 50%
return new int[]{originalWidth / 2, originalHeight / 2};
}
}4. 工具方法示例
用于提取文件后綴名:
5. 注意事項(xiàng)
- 操作系統(tǒng)臨時目錄:根據(jù)不同操作系統(tǒng),創(chuàng)建不同的臨時文件夾路徑。
- 文件清理:上傳完成后及時刪除臨時文件,避免占用過多磁盤空間。
- 縮略圖格式支持:目前支持 PNG、JPG、JPEG、GIF 格式。
- 上傳邏輯:
uploadFile方法需根據(jù)具體的存儲服務(wù)(例如 MinIO、OSS、七牛云等)自定義實(shí)現(xiàn)。
6. 總結(jié)
通過以上步驟,我們成功實(shí)現(xiàn)了圖片上傳并生成縮略圖的功能。此功能不僅能有效減少圖片加載時間,還能節(jié)省存儲空間,提升系統(tǒng)性能。
到此這篇關(guān)于基于SpringBoot實(shí)現(xiàn)圖片上傳并生成縮略圖功能的文章就介紹到這了,更多相關(guān)SpringBoot圖片上傳并生成縮略圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java后端pageHelper分頁實(shí)現(xiàn)方法步驟
這篇文章主要給大家介紹了關(guān)于java后端pageHelper分頁實(shí)現(xiàn)方法的相關(guān)資料,在我們的Java項(xiàng)目中分頁是必不可少的數(shù)據(jù)展示頁面,文中通過圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
Java實(shí)現(xiàn)將PPT轉(zhuǎn)為OFD過程詳解
本文將通過Java后端程序代碼展示如何實(shí)現(xiàn)將PPT幻燈片轉(zhuǎn)成OFD格式,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下2022-01-01
Java中數(shù)組的創(chuàng)建與傳參方法(學(xué)習(xí)小結(jié))
這篇文章主要介紹了Java中數(shù)組的創(chuàng)建與傳參方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09
SpringBoot項(xiàng)目開發(fā)常用技術(shù)整合
今天給大家分享springboot項(xiàng)目開發(fā)常用技術(shù)整合,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2021-08-08
SpringBoot?Starter自定義全局加解密組件的詳細(xì)流程
SpringBoot?Starter作用將一組相關(guān)的依賴打包,簡化項(xiàng)目的配置和初始化過程,通過特定的Starter開發(fā)者可以快速的實(shí)現(xiàn)特定功能模塊的開發(fā)和擴(kuò)展,本文給大家介紹了SpringBoot?Starter自定義全局加解密組件的詳細(xì)流程,需要的朋友可以參考下2024-02-02
通過圖例了解IDEA引入JQuery實(shí)現(xiàn)步驟
這篇文章主要介紹了IDEA引入JQuery實(shí)現(xiàn)步驟圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09
關(guān)于批量插入或更新數(shù)據(jù)(MyBatis-plus框架)
這篇文章主要介紹了關(guān)于批量插入或更新數(shù)據(jù)(MyBatis-plus框架),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09

