Java实现文件上传和url格式校验工具
更新时间:2026年04月03日 09:22:43 作者:咘噜biu
这篇文章主要介绍了如何使用Java实现文件上传和url格式校验工具,主要用于文件类型校验,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
废话不多说,直接上代码,用到了lombok, hutool, google guava等。
FileNameSuffixEnum
package com.visy.enums;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import com.google.common.collect.Lists;
import com.visy.util.TsListUtil;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.apache.commons.lang3.ClassUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
@Getter
@AllArgsConstructor
public enum FileNameSuffixEnum {
FILE_TYPE_JPG("jpg", "JPG"),
FILE_TYPE_JPEG("jpeg", "JPEG"),
FILE_TYPE_PNG("png", "PNG"),
FILE_TYPE_GIF("gif", "GIF"),
FILE_TYPE_BMP("bmp", "BMP"),
FILE_TYPE_APK("apk", "APK"),
FILE_TYPE_PFX("pfx", "PFX"),
FILE_TYPE_CRT("crt", "CRT"),
FILE_TYPE_CER("cer", "CER"),
FILE_TYPE_KEY("key", "KEY"),
FILE_TYPE_P12("p12", "P12"),
FILE_TYPE_TXT("txt", "TXT"),
FILE_TYPE_ZIP("zip", "ZIP"),
FILE_TYPE_ICO("ico", "ICO"),
FILE_TYPE_WEBP("webp", "WEBP"),
FILE_TYPE_PDF("pdf", "PDF"),
FILE_TYPE_XLS("xls", "XLS"),
FILE_TYPE_XLSX("xlsx", "XLSX");
private final String key;
private final String desc;
public static final List<String> photoNameList = Lists.newArrayList(
FILE_TYPE_JPG.getDesc(),
FILE_TYPE_JPEG.getDesc(),
FILE_TYPE_PNG.getDesc()
);
private static final List<String> imgNameList = TsListUtil.chain(photoNameList).addElements(
FILE_TYPE_GIF.getDesc(),
FILE_TYPE_BMP.getDesc()
).toList();
private static final List<String> excelNameList = Lists.newArrayList(
FILE_TYPE_XLS.getDesc(),
FILE_TYPE_XLSX.getDesc()
);
private static final List<String> keyNameList = Lists.newArrayList(
FILE_TYPE_PFX.getDesc(),
FILE_TYPE_CRT.getDesc(),
FILE_TYPE_CER.getDesc(),
FILE_TYPE_KEY.getDesc(),
FILE_TYPE_P12.getDesc()
);
private static final List<String> allFileNameList =
TsListUtil.chain(imgNameList).addAll(excelNameList).addAll(keyNameList).addElements(
FILE_TYPE_APK.getDesc(),
FILE_TYPE_TXT.getDesc(),
FILE_TYPE_ZIP.getDesc(),
FILE_TYPE_ICO.getDesc(),
FILE_TYPE_WEBP.getDesc(),
FILE_TYPE_PDF.getDesc()
).toList();
public static boolean isNotPhotoFile(MultipartFile file){
return !isFileTypeOf(file, photoNameList);
}
public static boolean isNotImgFile(MultipartFile file){
return !isFileTypeOf(file, imgNameList);
}
public static boolean isNotExcelFile(MultipartFile file){
return !isFileTypeOf(file, excelNameList);
}
public static boolean isNotInstallFile(MultipartFile file){
return !isFileTypeOf(file, Lists.newArrayList(FILE_TYPE_APK.getDesc()));
}
public static boolean isNotKeyFile(MultipartFile file){
return !isFileTypeOf(file, keyNameList);
}
public static boolean isNotAllowFile(MultipartFile file){
return !isFileTypeOf(file, allFileNameList);
}
public static boolean isNotPhotoUrl(Object obj, String ...fieldNames){
return !isUrlTypeOf(photoNameList, obj, fieldNames);
}
public static boolean isNotImgUrl(Object obj, String ...fieldNames){
return !isUrlTypeOf(imgNameList, obj, fieldNames);
}
public static boolean isNotKeyUrl(Object obj, String ...fieldNames){
return !isUrlTypeOf(keyNameList, obj, fieldNames);
}
public static boolean isNotAllowUrl(Object obj, String ...fieldNames){
return !isUrlTypeOf(allFileNameList, obj, fieldNames);
}
private static boolean isFileTypeOf(MultipartFile file, List<String> extensions){
if (ObjectUtil.isNull(file)) {
return true;
}
//获取文件扩展名
String suffix = FileUtil.extName(file.getOriginalFilename());
// 校验文件扩展名
return StringUtils.hasText(suffix) && extensions.contains(suffix.toUpperCase());
}
private static boolean isUrlTypeOf(List<String> extensions, Object obj, String ...fieldNames){
return isUrlTypeOf(extensions, obj, Arrays.stream(fieldNames).collect(Collectors.toSet()));
}
/**
* 判断对象中指定的属性值是否是指定文件类型
* @param extensions 允许的文件扩展名
* @param obj 要检查的对象
* @param fieldNames 要检查的属性名称列表
* 对于集合、数组、Map、对象,会递归检查属性值
* 要检查对象的非直接属性时,需要传递中间对象的名称,如: {"a": {"b": {"c": ["x.jpg"] }}}
* 若要检查c列表中的url, fieldNames参数须为: "a", "b", "c", 不能只传 "c"
* @return 校验是否通过
*/
private static boolean isUrlTypeOf(List<String> extensions, Object obj, Set<String> fieldNames){
if(ObjectUtil.isNull(obj) || CollUtil.isEmpty(fieldNames)){
return true;
}
if(ClassUtils.isPrimitiveOrWrapper(obj.getClass())){
//排除基本类型及其包装类
return true;
}
if(obj instanceof String){ //String
return isUrlTypeOf(obj.toString(), extensions);
}else if(obj instanceof Collection<?>){ //Collection
for(Object item : (Collection<?>)obj){
if(!isUrlTypeOf(extensions, item, fieldNames)){
return false;
}
}
}else if(clazz.isArray()){ //Array
for (int i=0,l=Array.getLength(obj); i<l; i++) {
if(!isUrlTypeOf(extensions, Array.get(obj, i), fieldNames)){
return false;
}
}
}else if(obj instanceof Map<?,?>){ //Map
for(Map.Entry<?,?> entry : ((Map<?,?>)obj).entrySet()){
if(
fieldNames.contains(String.valueOf(entry.getKey()))
&& !isUrlTypeOf(extensions, entry.getValue(), fieldNames)
){
return false;
}
}
}else{ //Object
for(Field field : ReflectUtil.getFields(obj.getClass())){
if(
fieldNames.contains(field.getName())
&& !isUrlTypeOf(extensions, ReflectUtil.getFieldValue(obj, field), fieldNames)
){
return false;
}
}
}
return true;
}
private static boolean isUrlTypeOf(String url, List<String> extensions){
if (!StringUtils.hasText(url)) {
return true;
}
//获取文件扩展名
String suffix = FileUtil.extName(url.trim());
//校验文件扩展名
return StringUtils.hasText(suffix) && extensions.contains(suffix.toUpperCase());
}
}
TsListUtil
package com.visy.util;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ReflectUtil;
import org.springframework.beans.BeanUtils;
import java.util.*;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class TsListUtil {
public static <T,R> List<R> convert(List<T> list, Function<T,R> converter){
return empty(list).stream().map(converter).collect(Collectors.toList());
}
public static <T,R> List<R> convert(List<T> list, Class<R> rClazz){
return convert(list, item -> {
R r = ReflectUtil.newInstance(rClazz);
BeanUtils.copyProperties(item, r);
return r;
});
}
public static <T> List<T> empty(List<T> list){
return Objects.isNull(list) ? new ArrayList<>() : list;
}
/**
* 合并列表
* @param list 列表
* @param keyMapper 获取key的函数
* @param merger 合并的函数
* @return 合并后的列表
* @param <K> key的类型
* @param <V> 值类型
*/
public static <K,V> List<V> mergeList(List<V> list, Function<V,K> keyMapper, BiFunction<? super V, ? super V, ? extends V> merger) {
if (CollUtil.isEmpty(list)) {
return Collections.emptyList();
}
Map<K, V> mergedMap = new LinkedHashMap<>(); //保持顺序
for (V item : list) {
mergedMap.merge(keyMapper.apply(item), item, merger);
}
return new ArrayList<>(mergedMap.values());
}
public static <T> ListChain<T> chain(List<T> list) {
return new ListChain<>(list);
}
public static class ListChain<T> {
private final List<T> list;
private ListChain(List<T> list) {
//注意这里是拷贝一份,但也不是深度拷贝,修改内部的对象仍需谨慎
this.list = list==null ? new ArrayList<>() : new ArrayList<>(list);
}
public ListChain<T> removeIf(Predicate<? super T> filter) {
this.list.removeIf(filter);
return this;
}
public ListChain<T> forEach(Consumer<? super T> action){
this.list.forEach(action);
return this;
}
public ListChain<T> addAll(List<T> otherList){
this.list.addAll(otherList);
return this;
}
@SafeVarargs
public final ListChain<T> addElements(T... elements){
if(elements!=null && elements.length>0){
this.list.addAll(Arrays.asList(elements));
}
return this;
}
public <K> ListChain<T> merge(Function<T,K> keyMapper, BiFunction<? super T, ? super T, ? extends T> merger){
return new ListChain<>(mergeList(this.list, keyMapper, merger));
}
public List<T> toList(){
return this.list;
}
public Stream<T> stream(){
return toList().stream();
}
}
}
到此这篇关于Java实现文件上传和url格式校验工具的文章就介绍到这了,更多相关Java格式校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
详解MyBatis-Plus Wrapper条件构造器查询大全
这篇文章主要介绍了详解MyBatis-Plus Wrapper条件构造器查询大全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-08-08
微信js sdk invalid signature签名错误问题的解决方法分析
这篇文章主要介绍了微信js sdk invalid signature签名错误问题的解决方法,结合实例形式分析了微信签名错误问题相关解决方法,需要的朋友可以参考下2019-04-04


最新评论