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条件构造器查询大全

    这篇文章主要介绍了详解MyBatis-Plus Wrapper条件构造器查询大全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • JAVA 文件监控 WatchService的示例方法

    JAVA 文件监控 WatchService的示例方法

    本篇文章主要介绍了JAVA 文件监控 WatchService的示例方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • SpringBoot中jar启动下如何读取文件路径

    SpringBoot中jar启动下如何读取文件路径

    这篇文章主要介绍了SpringBoot jar启动下如何读取文件路径,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 微信js sdk invalid signature签名错误问题的解决方法分析

    微信js sdk invalid signature签名错误问题的解决方法分析

    这篇文章主要介绍了微信js sdk invalid signature签名错误问题的解决方法,结合实例形式分析了微信签名错误问题相关解决方法,需要的朋友可以参考下
    2019-04-04
  • Java享元设计模式优化对象创建提高性能和效率

    Java享元设计模式优化对象创建提高性能和效率

    Java享元设计模式通过共享可重用的对象,减少了系统中对象的数量,优化了对象的创建和管理,提高了性能和效率。它是一种经典的设计模式,适用于需要处理大量相似对象的应用程序
    2023-04-04
  • Spring事务aftercommit原理及实践

    Spring事务aftercommit原理及实践

    这篇文章主要为大家介绍了Spring事务aftercommit原理及实践,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • java 同步、异步、阻塞和非阻塞分析

    java 同步、异步、阻塞和非阻塞分析

    这篇文章主要介绍了java 同步、异步、阻塞和非阻塞分析的相关资料,需要的朋友可以参考下
    2017-02-02
  • Spring Cloud 服务网关Zuul的实现

    Spring Cloud 服务网关Zuul的实现

    这篇文章主要介绍了Spring Cloud 服务网关Zuul的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • java中Struts2 的文件上传和下载示例

    java中Struts2 的文件上传和下载示例

    这篇文章主要介绍了java中Struts2 的文件上传和下载示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。
    2016-12-12
  • java发送http请求时如何处理异步回调结果

    java发送http请求时如何处理异步回调结果

    这篇文章主要介绍了java发送http请求时如何处理异步回调结果问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06

最新评论