你可以试试蒂卡。需要此依赖关系:
org.apache.tika:tika-core:3.0.0
类似验证器中的示例用法
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.apache.tika.Tika;
import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.Set;
public class MultiPartFileValidator implements ConstraintValidator<ValidFileType, MultipartFile> {
private static final Set<String> ALLOWED_FILETYPES =
Set.of(MediaType.IMAGE_PNG_VALUE, MediaType.IMAGE_JPEG_VALUE);
private static final Tika TIKA = new Tika();
private long maxFileSize;
private String invalidFileTypeMessage;
private String invalidSizeMessage;
@Override
public void initialize(ValidFileType constraintAnnotation) {
this.maxFileSize = constraintAnnotation.maxFileSize();
this.invalidFileTypeMessage = constraintAnnotation.invalidFileTypeMessage();
this.invalidSizeMessage = constraintAnnotation.invalidSizeMessage();
}
@Override
public boolean isValid(MultipartFile file, ConstraintValidatorContext context) {
if (file == null) {
return true;
}
context.disableDefaultConstraintViolation();
if (file.getSize() > maxFileSize) {
return setValidationError(invalidSizeMessage, context);
}
try {
String mimeType = TIKA.detect(file.getBytes());
if (!ALLOWED_FILETYPES.contains(mimeType)) {
return setValidationError(invalidFileTypeMessage, context);
}
} catch (IOException e) {
return setValidationError("Unable to detect file type", context);
}
return true;
}
private static boolean setValidationError(String message, ConstraintValidatorContext context) {
context.buildConstraintViolationWithTemplate(message).addConstraintViolation();
return false;
}
}