欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1. 自定義文件驗(yàn)證注解

首先在Spring Boot中定義一個(gè)注解,用于標(biāo)記需要校驗(yàn)的文件字段。這個(gè)注解包含驗(yàn)證所需的參數(shù):允許的擴(kuò)展名、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; // 默認(rèn)最大1MB
}

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

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

接下來,創(chuàng)建一個(gè)類來實(shí)現(xiàn)ConstraintValidator接口,具體實(shí)現(xiàn)文件的擴(kuò)展名、類型、大小的校驗(yà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;
        }
        // 文件大小驗(yàn)證
        if (file.getSize() > maxSize) {
            return false;
        }
        // 文件擴(kuò)展名驗(yàn)證
        // 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驗(yàn)證文件mime,實(shí)際是通過文件頭內(nèi)容中的魔法數(shù)來驗(yàn)證的
        var detect = tika.detect(TikaInputStream.get(file.getInputStream()));
        return mimeTypes.contains(detect);
    }
}

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

3. 使用注解

最后在Spring Boot的Controller中使用這個(gè)注解來校驗(yàn)文件。

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注解驗(yàn)證文件的擴(kuò)展名是否為"jpg"或"png",MIME類型是否為"image/jpeg"或"image/png",以及文件大小是否不超過2MB。如果文件不符合這些要求,SpringBoot將自動(dòng)返回400 Bad Request響應(yīng)。

  • 以上注解合并了三個(gè)驗(yàn)證邏輯, 會(huì)導(dǎo)致驗(yàn)證失敗是提示語不具體, 如有改需求,可以將其拆分成為三個(gè)注解.

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

相關(guān)文章

  • Java ExecutorService四種線程池使用詳解

    Java ExecutorService四種線程池使用詳解

    這篇文章主要介紹了Java ExecutorService四種線程池使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • JavaWeb詳細(xì)講述Cookie和Session的概念

    JavaWeb詳細(xì)講述Cookie和Session的概念

    web開發(fā)階段我們主要是瀏覽器和服務(wù)器之間來進(jìn)行交互。瀏覽器和服務(wù)器之間的交互就像人和人之間進(jìn)行交流一樣,但是對于機(jī)器來說,在一次請求之間只是會(huì)攜帶著本次請求的數(shù)據(jù)的,但是可能多次請求之間是會(huì)有聯(lián)系的,所以提供了會(huì)話機(jī)制
    2022-06-06
  • java  Callable與Future的詳解及實(shí)例

    java Callable與Future的詳解及實(shí)例

    這篇文章主要介紹了java Callable與Future的詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • java數(shù)組排序示例分享

    java數(shù)組排序示例分享

    這篇文章主要介紹了java數(shù)組排序示例,需要的朋友可以參考下
    2014-03-03
  • Springboot如何設(shè)置過濾器及重復(fù)讀取request里的body

    Springboot如何設(shè)置過濾器及重復(fù)讀取request里的body

    這篇文章主要介紹了Springboot如何設(shè)置過濾器及重復(fù)讀取request里的body,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Spring-boot的debug調(diào)試代碼實(shí)例

    Spring-boot的debug調(diào)試代碼實(shí)例

    這篇文章主要介紹了Spring-boot的debug調(diào)試代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java連接數(shù)據(jù)庫的5種方式解讀

    java連接數(shù)據(jù)庫的5種方式解讀

    這篇文章主要介紹了java連接數(shù)據(jù)庫的5種方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教<BR>
    2024-04-04
  • Spring Data JPA的作用和用法小結(jié)

    Spring Data JPA的作用和用法小結(jié)

    Spring Data JPA是Spring框架的一個(gè)模塊,它提供了一種數(shù)據(jù)訪問抽象,允許以一種聲明式和簡潔的方式來處理數(shù)據(jù)庫操作,本文主要介紹了Spring Data JPA的作用和用法小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • Java中Integer.valueOf,parsetInt() String.valueOf的區(qū)別和結(jié)果代碼解析

    Java中Integer.valueOf,parsetInt() String.valueOf的區(qū)別和結(jié)果代碼解析

    本文通過代碼給大家講解了JAVA中Integer.valueOf, parsetInt() String.valueOf的區(qū)別和結(jié)果,需要的朋友可以參考下
    2018-05-05
  • mybatis?plus新增(insert)數(shù)據(jù)獲取主鍵id的問題

    mybatis?plus新增(insert)數(shù)據(jù)獲取主鍵id的問題

    這篇文章主要介紹了mybatis?plus新增(insert)數(shù)據(jù)獲取主鍵id的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評論