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

SpringBoot實現(xiàn)自定義注解用于文件驗證的詳細過程(大小、擴展名、MIME類型)

 更新時間:2024年08月25日 09:10:51   作者:碼到三十五  
SpringBoot,Spring Cloud中經(jīng)常需要處理文件上傳的功能,為了確保上傳的文件滿足特定的要求(如擴展名、MIME類型和文件大小),我們可以創(chuàng)建一個自定義注解來簡化驗證過程,需要的朋友可以參考下

1. 自定義文件驗證注解

首先在Spring Boot中定義一個注解,用于標記需要校驗的文件字段。這個注解包含驗證所需的參數(shù):允許的擴展名、MIME類型和最大文件大小。

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Documented
@Constraint(validatedBy = FileValidator.class)
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidFile {
    String message() default "{constraints.ValidFileMimeType.message}";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};

    String[] extensions() default {};
    String[] mimeTypes() default {};
    long maxSize() default 1024 * 1024; // 默認最大1MB
}

注釋的組成部分:
maxSize: 文件大小限制,默認1M
mimeTypes:MIME類型
extensions:允許的擴展名
message():驗證失敗時的默認錯誤消息
constraint(validatedBy = FileValidator.class):自定義的約束器實現(xiàn)

2. 實現(xiàn)約束驗證器

接下來,創(chuàng)建一個類來實現(xiàn)ConstraintValidator接口,具體實現(xiàn)文件的擴展名、類型、大小的校驗邏輯。

import org.springframework.web.multipart.MultipartFile;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.io.IOException;

public class FileValidator implements ConstraintValidator<ValidFile, MultipartFile> {
    private final Tika tika = new Tika();
    private List<String> extensions;
    private List<String> mimeTypes;
    private long maxSize;

    @Override
    public void initialize(ValidFile constraintAnnotation) {
        extensions = List.of(constraintAnnotation.extensions());
        mimeTypes = List.of(constraintAnnotation.mimeTypes());
        maxSize = constraintAnnotation.maxSize();
    }

    @Override
    public boolean isValid(MultipartFile file, ConstraintValidatorContext context) {
        if (file == null || file.isEmpty()) {
            return true;
        }
        // 文件大小驗證
        if (file.getSize() > maxSize) {
            return false;
        }
        // 文件擴展名驗證
        // String fileName = file.getOriginalFilename();
        // String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);
        String fileExtension = FilenameUtils.getExtension(file.getOriginalFilename());
        if( StringUtils.isNotBlank(fileExtension) && extensions.contains(fileExtension .toLowerCase())){
            retrun true;
        }
        // 這里使用apache tika驗證文件mime,實際是通過文件頭內(nèi)容中的魔法數(shù)來驗證的
        var detect = tika.detect(TikaInputStream.get(file.getInputStream()));
        return mimeTypes.contains(detect);
    }
}

注: apache tika 是一個開源的文檔識別工具,它可以自動檢測文件類型并提取文件內(nèi)容。使用 Tika,可以方便地確定文件類型和拓展名,從而根據(jù)文件類型來執(zhí)行相應(yīng)的操作,具體使用不是本文內(nèi)容不再介紹了.

3. 使用注解

最后在Spring Boot的Controller中使用這個注解來校驗文件。

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.constraints.NotNull;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public ResponseEntity<?> uploadFile(@RequestParam("file") @NotNull @ValidFile(extensions = {"jpg", "png"}, mimeTypes = {"image/jpeg", "image/png"}, maxSize = 2 * 1024 * 1024) MultipartFile file) {
        // 文件處理邏輯
        return ResponseEntity.ok("File uploaded successfully");
    }
}

@ValidFile注解驗證文件的擴展名是否為"jpg"或"png",MIME類型是否為"image/jpeg"或"image/png",以及文件大小是否不超過2MB。如果文件不符合這些要求,SpringBoot將自動返回400 Bad Request響應(yīng)。

  • 以上注解合并了三個驗證邏輯, 會導致驗證失敗是提示語不具體, 如有改需求,可以將其拆分成為三個注解.

到此這篇關(guān)于SpringBoot實現(xiàn)自定義注解用于文件驗證的詳細過程(大小、擴展名、MIME類型)的文章就介紹到這了,更多相關(guān)SpringBoot自定義注解文件驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Springboot控制反轉(zhuǎn)與Bean對象的方法

    Springboot控制反轉(zhuǎn)與Bean對象的方法

    文章介紹了Spring Boot中的控制反轉(zhuǎn)(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依賴關(guān)系,它詳細講解了Bean的注冊過程,包括通過@ComponentScan和@Bean注解的方式,并討論了Bean的依賴注入方法,如構(gòu)造器注入、Setter注入和字段注入,感興趣的朋友一起看看吧
    2025-03-03
  • java中線程的sleep()方法和yield()方法的區(qū)別

    java中線程的sleep()方法和yield()方法的區(qū)別

    本文主要介紹了java中線程的sleep()方法和yield()方法的區(qū)別,Thread類的sleep()方法使線程休眠指定時間,不釋放鎖,而yield()提示調(diào)度器當前線程愿意讓出CPU資源,不保證立即切換線程,感興趣的可以了解一下
    2024-10-10
  • 實例詳解Java庫中的LocalDate類

    實例詳解Java庫中的LocalDate類

    在做報表統(tǒng)計時,需要對指定時間內(nèi)的數(shù)據(jù)做統(tǒng)計,則需要使用到時間日期API,下面這篇文章主要給大家介紹了關(guān)于Java庫中LocalDate類的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • MyBatis的逆向工程詳解

    MyBatis的逆向工程詳解

    這篇文章主要介紹了MyBatis的逆向工程詳解,詳細的介紹了逆行工程的概念和實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • 阿里面試Nacos配置中心交互模型是push還是pull原理解析

    阿里面試Nacos配置中心交互模型是push還是pull原理解析

    這篇文章主要為大家介紹了阿里面試Nacos配置中心交互模型是push還是pull原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 基于Java實現(xiàn)圖形驗證碼工具類

    基于Java實現(xiàn)圖形驗證碼工具類

    這篇文章主要為大家詳細介紹了如何基于Java實現(xiàn)圖形驗證碼工具類,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-11-11
  • JUnit 5 中的 @ClassTemplate 實戰(zhàn)攻略

    JUnit 5 中的 @ClassTemplate 實戰(zhàn)攻略

    這篇文章主要介紹了JUnit 5 中的 @ClassTemplate 實戰(zhàn)指南,在本文中,我們從基礎(chǔ)概念出發(fā),進一步深入了解@ClassTemplate的使用方式,重點考察了提供者如何為單個測試類提供多個執(zhí)行上下文,需要的朋友可以參考下
    2025-12-12
  • Java中實現(xiàn)可拖放圖片剪裁入門教程

    Java中實現(xiàn)可拖放圖片剪裁入門教程

    這篇文章主要介紹了Java中實現(xiàn)可拖放圖片剪裁入門教程,本文寫給新手,分步驟講解如何實現(xiàn)圖片裁剪,并對每步的代碼作注釋,需要的朋友可以參考下
    2015-01-01
  • EditPlus運行java時從鍵盤輸入數(shù)據(jù)的操作方法

    EditPlus運行java時從鍵盤輸入數(shù)據(jù)的操作方法

    這篇文章主要介紹了EditPlus運行java時從鍵盤輸入數(shù)據(jù)的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • SpringBoot中動態(tài)數(shù)據(jù)源配置與使用詳解

    SpringBoot中動態(tài)數(shù)據(jù)源配置與使用詳解

    在現(xiàn)代應(yīng)用中,處理多數(shù)據(jù)源是常見的需求,在 Spring Boot 中,這樣的需求可以通過動態(tài)數(shù)據(jù)源來輕松實現(xiàn),本篇博客將詳細介紹如何在 Spring Boot 中配置和使用動態(tài)數(shù)據(jù)源,并演示如何切換到指定的數(shù)據(jù)源,需要的朋友可以參考下
    2024-10-10

最新評論

兴隆县| 石柱| 固原市| 尉犁县| 横峰县| 芷江| 临澧县| 格尔木市| 仁怀市| 富源县| 八宿县| 来宾市| 娱乐| 仪征市| 酒泉市| 玛纳斯县| 鹰潭市| 乌鲁木齐市| 渝北区| 夹江县| 绥中县| 和静县| 绍兴县| 水富县| 德化县| 长春市| 邛崃市| 正镶白旗| 珲春市| 突泉县| 遂平县| 南岸区| 巴马| 滨海县| 宁海县| 阿拉尔市| 沙坪坝区| 石河子市| 藁城市| 广宗县| 尉犁县|