最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在SpringBoot項(xiàng)目中實(shí)現(xiàn)圖片縮略圖功能的三種方案

 更新時間:2025年10月24日 10:12:08   作者:匆匆忙忙游刃有余  
本文介紹了在SpringBoot項(xiàng)目中實(shí)現(xiàn)圖片縮略圖的三種方案:使用Thumbnailator庫、JavaAWT原生庫以及集成MinIO自動生成縮略圖,每種方案都詳細(xì)介紹了實(shí)現(xiàn)步驟,并提供了完整的案例,需要的朋友可以參考下

引言

在SpringBoot項(xiàng)目中實(shí)現(xiàn)圖片縮略圖功能,主要有兩種常用方案:使用第三方庫Thumbnailator(推薦)或使用Java AWT原生庫。下面詳細(xì)介紹這兩種實(shí)現(xiàn)方式及完整案例。

方案一:使用Thumbnailator庫(推薦)

Thumbnailator是Google開源的一個優(yōu)秀圖片處理庫,使用簡單且功能強(qiáng)大。

1. 引入依賴

<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>

2. 實(shí)現(xiàn)服務(wù)層

創(chuàng)建一個服務(wù)接口和實(shí)現(xiàn)類:

public interface IThumbnailsService {
    // 指定大小縮放
    String changeSize(MultipartFile file, int width, int height);
    
    // 指定比例縮放
    String changeScale(MultipartFile file, double scale);
}

@Service
public class ThumbnailsServiceImpl implements IThumbnailsService {
    
    @Override
    public String changeSize(MultipartFile file, int width, int height) {
        try {
            // 生成文件名
            String originalFilename = file.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            String fileName = UUID.randomUUID().toString() + suffix;
            
            // 保存路徑
            String uploadDir = "upload/thumbnail/";
            File directory = new File(uploadDir);
            if (!directory.exists()) {
                directory.mkdirs();
            }
            
            String filePath = uploadDir + fileName;
            
            // 使用Thumbnailator生成縮略圖
            Thumbnails.of(file.getInputStream())
                    .size(width, height)
                    .keepAspectRatio(true) // 保持寬高比
                    .toFile(filePath);
            
            return "success: " + filePath;
        } catch (IOException e) {
            e.printStackTrace();
            return "error: " + e.getMessage();
        }
    }
    
    @Override
    public String changeScale(MultipartFile file, double scale) {
        try {
            String originalFilename = file.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
            String fileName = UUID.randomUUID().toString() + suffix;
            
            String uploadDir = "upload/thumbnail/";
            File directory = new File(uploadDir);
            if (!directory.exists()) {
                directory.mkdirs();
            }
            
            String filePath = uploadDir + fileName;
            
            // 按比例縮放
            Thumbnails.of(file.getInputStream())
                    .scale(scale) // scale是縮放比例,如0.5表示縮小到原圖的50%
                    .toFile(filePath);
            
            return "success: " + filePath;
        } catch (IOException e) {
            e.printStackTrace();
            return "error: " + e.getMessage();
        }
    }
}

3. 實(shí)現(xiàn)控制器

@RestController
@RequestMapping("/api/thumbnail")
public class ThumbnailsController {
    
    @Autowired
    private IThumbnailsService thumbnailsService;
    
    /**
     * 按指定尺寸生成縮略圖
     */
    @PostMapping("/changeSize")
    public String changeSize(@RequestParam("file") MultipartFile file,
                            @RequestParam(defaultValue = "300") int width,
                            @RequestParam(defaultValue = "300") int height) {
        return thumbnailsService.changeSize(file, width, height);
    }
    
    /**
     * 按比例生成縮略圖
     */
    @PostMapping("/changeScale")
    public String changeScale(@RequestParam("file") MultipartFile file,
                             @RequestParam(defaultValue = "0.5") double scale) {
        return thumbnailsService.changeScale(file, scale);
    }
}

方案二:使用Java AWT原生庫

如果不想引入第三方庫,也可以使用Java自帶的AWT庫實(shí)現(xiàn)圖片縮放功能。

1. 實(shí)現(xiàn)服務(wù)層

@Service
public class AWTThumbnailService {
    
    public String generateThumbnail(MultipartFile file, int targetWidth, int targetHeight) {
        try {
            // 讀取原始圖片
            BufferedImage originalImage = ImageIO.read(file.getInputStream());
            
            // 計(jì)算等比例縮放后的尺寸
            double widthRatio = (double) targetWidth / originalImage.getWidth();
            double heightRatio = (double) targetHeight / originalImage.getHeight();
            double ratio = Math.min(widthRatio, heightRatio);
            
            int newWidth = (int) (originalImage.getWidth() * ratio);
            int newHeight = (int) (originalImage.getHeight() * ratio);
            
            // 創(chuàng)建縮略圖
            BufferedImage thumbnail = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = thumbnail.createGraphics();
            g.drawImage(originalImage.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
            g.dispose();
            
            // 保存縮略圖
            String originalFilename = file.getOriginalFilename();
            String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
            String fileName = UUID.randomUUID().toString() + "." + suffix;
            
            String uploadDir = "upload/thumbnail/";
            File directory = new File(uploadDir);
            if (!directory.exists()) {
                directory.mkdirs();
            }
            
            String filePath = uploadDir + fileName;
            File outputFile = new File(filePath);
            ImageIO.write(thumbnail, suffix, outputFile);
            
            return "success: " + filePath;
        } catch (IOException e) {
            e.printStackTrace();
            return "error: " + e.getMessage();
        }
    }
}

高級功能擴(kuò)展

1. 批量生成不同尺寸縮略圖

@Override
public Map<String, String> generateMultiSizeThumbnails(MultipartFile file, Map<String, int[]> sizeMap) {
    Map<String, String> result = new HashMap<>();
    
    try {
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        String baseName = UUID.randomUUID().toString();
        
        String uploadDir = "upload/thumbnail/";
        File directory = new File(uploadDir);
        if (!directory.exists()) {
            directory.mkdirs();
        }
        
        for (Map.Entry<String, int[]> entry : sizeMap.entrySet()) {
            String key = entry.getKey();
            int width = entry.getValue()[0];
            int height = entry.getValue()[1];
            
            String fileName = baseName + "_" + key + suffix;
            String filePath = uploadDir + fileName;
            
            Thumbnails.of(file.getInputStream())
                    .size(width, height)
                    .keepAspectRatio(true)
                    .toFile(filePath);
            
            result.put(key, filePath);
        }
    } catch (IOException e) {
        e.printStackTrace();
        result.put("error", e.getMessage());
    }
    
    return result;
}

2. 異步生成縮略圖(優(yōu)化性能)

對于大量圖片或大圖片的處理,可以使用異步方式:

@Configuration
@EnableAsync
public class AsyncConfig {
    @Bean("thumbnailThreadPool")
    public Executor thumbnailThreadPool() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.setThreadNamePrefix("thumbnail-pool-");
        executor.initialize();
        return executor;
    }
}

@Service
public class AsyncThumbnailService {
    
    @Async("thumbnailThreadPool")
    public CompletableFuture<String> asyncGenerateThumbnail(MultipartFile file, int width, int height) {
        // 實(shí)現(xiàn)與同步方法類似
        // ...
        return CompletableFuture.completedFuture(filePath);
    }
}

方案三:集成MinIO自動生成縮略圖

如果項(xiàng)目使用MinIO存儲圖片,可以使用minio-plus-spring-boot-starter實(shí)現(xiàn)上傳時自動生成縮略圖。

1. 引入依賴

<dependency>
    <groupId>com.github.ixleo</groupId>
    <artifactId>minio-plus-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

2. 配置文件

minio:
  endpoint: http://minio:9000
  access-key: minioadmin
  secret-key: minioadmin
  plus:
    thumbnail-width: 300  # 默認(rèn)縮略圖寬度
    thumbnail-bucket: ${bucket}-preview  # 縮略圖存儲桶

3. 使用示例

@Service
public class MinioThumbnailService {
    
    @Autowired
    private MinioPlusTemplate minioPlusTemplate;
    
    public String uploadWithThumbnail(MultipartFile file, String bucketName) {
        try {
            // 上傳原圖并自動生成縮略圖
            String originUrl = minioPlusTemplate.putObject(bucketName, file);
            
            // 獲取縮略圖URL
            String thumbUrl = minioPlusTemplate.getPreviewUrl(bucketName, file.getOriginalFilename());
            
            return thumbUrl;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

注意事項(xiàng)和優(yōu)化建議

圖片格式支持:確保支持常用圖片格式(JPG、PNG、GIF等),并在代碼中進(jìn)行格式驗(yàn)證

文件大小限制:配置文件上傳大小限制,防止大文件占用過多資源

spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

異常處理:完善異常捕獲和處理,提供友好的錯誤信息

文件路徑安全:使用UUID生成文件名,避免路徑遍歷攻擊

存儲空間管理:定期清理過期的臨時文件和縮略圖

性能優(yōu)化:對于大量圖片處理,考慮使用多線程異步處理

通過以上幾種方式,您可以在SpringBoot項(xiàng)目中靈活實(shí)現(xiàn)圖片縮略圖功能,根據(jù)實(shí)際需求選擇最合適的方案。

以上就是在SpringBoot項(xiàng)目中實(shí)現(xiàn)圖片縮略圖功能的三種方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot圖片縮略圖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java隨機(jī)字符串生成示例

    java隨機(jī)字符串生成示例

    這篇文章主要介紹了java隨機(jī)字符串生成示例,這個字符隨機(jī)生成類可以生成多種組合的字符串,比如大+小字符+數(shù)字+符號,需要的朋友可以參考下
    2014-03-03
  • springboot修改端口號的實(shí)現(xiàn)方式

    springboot修改端口號的實(shí)現(xiàn)方式

    文章介紹了如何在Spring Boot項(xiàng)目中修改默認(rèn)端口號,通過在`application.properties`或`application.yml`文件中添加`server.port=端口號`來實(shí)現(xiàn)
    2026-01-01
  • 利用Intellij Idea連接遠(yuǎn)程服務(wù)器實(shí)現(xiàn)遠(yuǎn)程上傳部署功能

    利用Intellij Idea連接遠(yuǎn)程服務(wù)器實(shí)現(xiàn)遠(yuǎn)程上傳部署功能

    大家在使用Intellij Idea開發(fā)程序的時候,是不是需要部署到遠(yuǎn)程SSH服務(wù)器運(yùn)行呢,當(dāng)然也可以直接在idea軟件內(nèi)容實(shí)現(xiàn)配置部署操作,接下來通過本文給大家分享利用Intellij Idea連接遠(yuǎn)程服務(wù)器實(shí)現(xiàn)遠(yuǎn)程上傳部署功能,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Spring Web項(xiàng)目spring配置文件隨服務(wù)器啟動時自動加載

    Spring Web項(xiàng)目spring配置文件隨服務(wù)器啟動時自動加載

    這篇文章主要介紹了Spring Web項(xiàng)目spring配置文件隨服務(wù)器啟動時自動加載,加載spring的配置文件,并且只加載一次,從而提高程序效率。具體內(nèi)容詳情大家通過本文一起學(xué)習(xí)吧
    2018-01-01
  • Java中使用Preferences 的 API設(shè)置用戶偏好

    Java中使用Preferences 的 API設(shè)置用戶偏好

    這篇文章主要介紹了Java中使用Preferences 的 API設(shè)置用戶偏好的方法,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • IntelliJ IDEA遠(yuǎn)程Debug Linux的Java程序,找問題不要只會看日志了(推薦)

    IntelliJ IDEA遠(yuǎn)程Debug Linux的Java程序,找問題不要只會看日志了(推薦)

    這篇文章主要介紹了IntelliJ IDEA遠(yuǎn)程Debug Linux的Java程序,找問題不要只會看日志了,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • SpringBoot中如何使用Assert進(jìn)行斷言校驗(yàn)

    SpringBoot中如何使用Assert進(jìn)行斷言校驗(yàn)

    Java?提供了內(nèi)置的?assert?機(jī)制,而?Spring?框架也提供了更強(qiáng)大的?Assert?工具類來幫助開發(fā)者進(jìn)行參數(shù)校驗(yàn)和狀態(tài)檢查,下面我們就來看看SpringBoot中如何使用Assert進(jìn)行斷言校驗(yàn)吧
    2025-07-07
  • springboot整合vue項(xiàng)目(小試牛刀)

    springboot整合vue項(xiàng)目(小試牛刀)

    這篇文章主要介紹了springboot整合vue項(xiàng)目(小試牛刀),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • Java中equals和hashcode用法

    Java中equals和hashcode用法

    `equals`和`hashCode`方法在Java中密切相關(guān),必須保持一致性,如果兩個對象通過`equals`方法相等,它們的`hashCode`也必須相同,這對于基于哈希的數(shù)據(jù)結(jié)構(gòu)至關(guān)重要,因?yàn)檫@些結(jié)構(gòu)依賴哈希值進(jìn)行快速查找和存儲,為了減少哈希沖突
    2025-01-01
  • Java getResource()如何獲取class文件目錄位置

    Java getResource()如何獲取class文件目錄位置

    這篇文章主要介紹了Java getResource()如何獲取class文件目錄位置,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12

最新評論

江门市| 澄城县| 威远县| 利辛县| 武平县| 信丰县| 平顶山市| 固阳县| 彩票| 忻州市| 嘉义县| 大关县| 永州市| 霍邱县| 清徐县| 澄城县| 广灵县| 云南省| 兴业县| 万年县| 平远县| 兴化市| 岗巴县| 鄱阳县| 陇南市| 蕲春县| 湖北省| 沭阳县| 昭通市| 呼伦贝尔市| 张家界市| 成安县| 南丰县| 香港| 光山县| 新泰市| 鲜城| 宁德市| 平果县| 杂多县| 图片|