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

Java實現(xiàn)文件上傳和url格式校驗工具

 更新時間:2026年04月03日 09:22:43   作者:咘嚕biu  
這篇文章主要介紹了如何使用Java實現(xiàn)文件上傳和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 要檢查的屬性名稱列表
    * 對于集合、數(shù)組、Map、對象,會遞歸檢查屬性值
    * 要檢查對象的非直接屬性時,需要傳遞中間對象的名稱,如: {"a": {"b": {"c": ["x.jpg"] }}}
    * 若要檢查c列表中的url, fieldNames參數(shù)須為: "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的函數(shù)
     * @param merger 合并的函數(shù)
     * @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) {
            //注意這里是拷貝一份,但也不是深度拷貝,修改內(nèi)部的對象仍需謹慎
            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();
        }
    }
}

到此這篇關(guān)于Java實現(xiàn)文件上傳和url格式校驗工具的文章就介紹到這了,更多相關(guān)Java格式校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java LinkedHashMap與HashMap的使用

    詳解Java LinkedHashMap與HashMap的使用

    這篇文章主要通過幾個示例為大家詳細介紹了Java中LinkedHashMap與HashMap的常見使用和概述,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-10-10
  • Java線程Dump分析工具jstack解析及使用場景

    Java線程Dump分析工具jstack解析及使用場景

    這篇文章主要介紹了Java線程Dump分析工具jstack解析及使用場景,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • SpringCloud?集成Sentinel的實戰(zhàn)教程

    SpringCloud?集成Sentinel的實戰(zhàn)教程

    這篇文章主要介紹了SpringCloud?集成Sentinel的詳細過程,本文通過實例代碼圖文相結(jié)合給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2024-08-08
  • 新手入門Jvm--jvm概覽

    新手入門Jvm--jvm概覽

    JVM是Java Virtual Machine(Java虛擬機)的縮寫,JVM是一種用于計算設(shè)備的規(guī)范,它是一個虛構(gòu)出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現(xiàn)的
    2021-06-06
  • SpringBoot利用@Validated注解優(yōu)雅實現(xiàn)參數(shù)校驗

    SpringBoot利用@Validated注解優(yōu)雅實現(xiàn)參數(shù)校驗

    在開發(fā) Web 應(yīng)用時,用戶輸入的合法性校驗是保障系統(tǒng)穩(wěn)定性的基礎(chǔ),?Spring Boot 的 @Validated 注解 提供了一種更優(yōu)雅的解決方案,下面就跟隨小編一起學習一下吧
    2025-04-04
  • spring中實現(xiàn)容器加載完成后再執(zhí)行自己的方法

    spring中實現(xiàn)容器加載完成后再執(zhí)行自己的方法

    這篇文章主要介紹了spring中實現(xiàn)容器加載完成后再執(zhí)行自己的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 使用idea搭建一個spring mvc項目的圖文教程

    使用idea搭建一個spring mvc項目的圖文教程

    這篇文章主要介紹了使用idea直接創(chuàng)建一個spring mvc項目的圖文教程,本文通過圖文并茂的方式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot整合Redis之編寫RedisConfig

    SpringBoot整合Redis之編寫RedisConfig

    RedisConfig需要對redis提供的兩個Template的序列化配置,所以本文為大家詳細介紹了SpringBoot整合Redis如何編寫RedisConfig,需要的可以參考下
    2022-06-06
  • java 反射機制

    java 反射機制

    本文主要介紹了java反射機制的相關(guān)知識,具有一定的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Java語言實現(xiàn)簡單FTP軟件 FTP遠程文件管理模塊實現(xiàn)(10)

    Java語言實現(xiàn)簡單FTP軟件 FTP遠程文件管理模塊實現(xiàn)(10)

    這篇文章主要為大家詳細介紹了Java語言實現(xiàn)簡單FTP軟件,F(xiàn)TP遠程文件管理模塊的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04

最新評論

铁岭县| 肥西县| 田阳县| 上高县| 寻乌县| 正蓝旗| 安乡县| 志丹县| 乐亭县| 榆树市| 福安市| 兴国县| 盘山县| 北票市| 洛浦县| 丹凤县| 墨江| 泰安市| 綦江县| 五华县| 雷州市| 冷水江市| 临泽县| 鄂托克旗| 镇沅| 和林格尔县| 大足县| 云霄县| 两当县| 新龙县| 光山县| 石景山区| 攀枝花市| 天台县| 宜君县| 贺兰县| 翁源县| 彰化市| 吉安市| 合川市| 德令哈市|