xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-core-boot/src/main/java/org/springblade/core/boot/file/BladeFileUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,240 @@
/*
 *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: Chill åº„骞 (smallchill@163.com)
 */
package org.springblade.core.boot.file;
import org.springblade.core.tool.utils.StringPool;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.web.multipart.MultipartFile;
import java.util.*;
/**
 * æ–‡ä»¶å·¥å…·ç±»
 *
 * @author Chill
 */
public class BladeFileUtil {
   /**
    * å®šä¹‰å…è®¸ä¸Šä¼ çš„æ–‡ä»¶æ‰©å±•名
    */
   private static final HashMap<String, String> EXT_MAP = new HashMap<>();
   private static final String IS_DIR = "is_dir";
   private static final String FILE_NAME = "filename";
   private static final String FILE_SIZE = "filesize";
   /**
    * å›¾ç‰‡æ‰©å±•名
    */
   private static final String[] FILE_TYPES = new String[]{"gif", "jpg", "jpeg", "png", "bmp"};
   static {
      EXT_MAP.put("image", ".gif,.jpg,.jpeg,.png,.bmp,.JPG,.JPEG,.PNG");
      EXT_MAP.put("flash", ".swf,.flv");
      EXT_MAP.put("media", ".swf,.flv,.mp3,.mp4,.wav,.wma,.wmv,.mid,.avi,.mpg,.asf,.rm,.rmvb");
      EXT_MAP.put("file", ".doc,.docx,.xls,.xlsx,.ppt,.htm,.html,.txt,.zip,.rar,.gz,.bz2");
      EXT_MAP.put("allfile", ".gif,.jpg,.jpeg,.png,.bmp,.swf,.flv,.mp3,.mp4,.wav,.wma,.wmv,.mid,.avi,.mpg,.asf,.rm,.rmvb,.doc,.docx,.xls,.xlsx,.ppt,.htm,.html,.txt,.zip,.rar,.gz,.bz2");
   }
   /**
    * èŽ·å–æ–‡ä»¶åŽç¼€
    *
    * @param fileName æ–‡ä»¶å
    * @return String è¿”回后缀
    */
   public static String getFileExt(String fileName) {
      return fileName.substring(fileName.lastIndexOf(StringPool.DOT));
   }
   /**
    * æµ‹è¯•文件后缀 åªè®©æŒ‡å®šåŽç¼€çš„æ–‡ä»¶ä¸Šä¼ ï¼Œåƒjsp,war,sh等危险的后缀禁止
    *
    * @param dir      ç›®å½•
    * @param fileName æ–‡ä»¶å
    * @return è¿”回成功与否
    */
   public static boolean testExt(String dir, String fileName) {
      String fileExt = getFileExt(fileName);
      String ext = EXT_MAP.get(dir);
      return StringUtil.isNotBlank(ext) && (ext.contains(fileExt.toLowerCase()) || ext.contains(fileExt.toUpperCase()));
   }
   /**
    * æ–‡ä»¶ç®¡ç†æŽ’序
    */
   public enum FileSort {
      /**
       * å¤§å°
       */
      size,
      /**
       * ç±»åž‹
       */
      type,
      /**
       * åç§°
       */
      name;
      /**
       * æ–‡æœ¬æŽ’序转换成枚举
       *
       * @param sort
       * @return
       */
      public static FileSort of(String sort) {
         try {
            return FileSort.valueOf(sort);
         } catch (Exception e) {
            return FileSort.name;
         }
      }
   }
   public static class NameComparator implements Comparator {
      @Override
      public int compare(Object a, Object b) {
         Hashtable hashA = (Hashtable) a;
         Hashtable hashB = (Hashtable) b;
         if (((Boolean) hashA.get(IS_DIR)) && !((Boolean) hashB.get(IS_DIR))) {
            return -1;
         } else if (!((Boolean) hashA.get(IS_DIR)) && ((Boolean) hashB.get(IS_DIR))) {
            return 1;
         } else {
            return ((String) hashA.get(FILE_NAME)).compareTo((String) hashB.get(FILE_NAME));
         }
      }
   }
   public static class SizeComparator implements Comparator {
      @Override
      public int compare(Object a, Object b) {
         Hashtable hashA = (Hashtable) a;
         Hashtable hashB = (Hashtable) b;
         if (((Boolean) hashA.get(IS_DIR)) && !((Boolean) hashB.get(IS_DIR))) {
            return -1;
         } else if (!((Boolean) hashA.get(IS_DIR)) && ((Boolean) hashB.get(IS_DIR))) {
            return 1;
         } else {
            if (((Long) hashA.get(FILE_SIZE)) > ((Long) hashB.get(FILE_SIZE))) {
               return 1;
            } else if (((Long) hashA.get(FILE_SIZE)) < ((Long) hashB.get(FILE_SIZE))) {
               return -1;
            } else {
               return 0;
            }
         }
      }
   }
   public static class TypeComparator implements Comparator {
      @Override
      public int compare(Object a, Object b) {
         Hashtable hashA = (Hashtable) a;
         Hashtable hashB = (Hashtable) b;
         if (((Boolean) hashA.get(IS_DIR)) && !((Boolean) hashB.get(IS_DIR))) {
            return -1;
         } else if (!((Boolean) hashA.get(IS_DIR)) && ((Boolean) hashB.get(IS_DIR))) {
            return 1;
         } else {
            return ((String) hashA.get("filetype")).compareTo((String) hashB.get("filetype"));
         }
      }
   }
   public static String formatUrl(String url) {
      return url.replaceAll("\\\\", "/");
   }
   /********************************BladeFile封装********************************************************/
   /**
    * èŽ·å–BladeFile封装类
    *
    * @param file æ–‡ä»¶
    * @return BladeFile
    */
   public static LocalFile getFile(MultipartFile file) {
      return getFile(file, "image", null, null);
   }
   /**
    * èŽ·å–BladeFile封装类
    *
    * @param file æ–‡ä»¶
    * @param dir  ç›®å½•
    * @return BladeFile
    */
   public static LocalFile getFile(MultipartFile file, String dir) {
      return getFile(file, dir, null, null);
   }
   /**
    * èŽ·å–BladeFile封装类
    *
    * @param file        æ–‡ä»¶
    * @param dir         ç›®å½•
    * @param path        è·¯å¾„
    * @param virtualPath è™šæ‹Ÿè·¯å¾„
    * @return BladeFile
    */
   public static LocalFile getFile(MultipartFile file, String dir, String path, String virtualPath) {
      return new LocalFile(file, dir, path, virtualPath);
   }
   /**
    * èŽ·å–BladeFile封装类
    *
    * @param files æ–‡ä»¶é›†åˆ
    * @return BladeFile
    */
   public static List<LocalFile> getFiles(List<MultipartFile> files) {
      return getFiles(files, "image", null, null);
   }
   /**
    * èŽ·å–BladeFile封装类
    *
    * @param files æ–‡ä»¶é›†åˆ
    * @param dir   ç›®å½•
    * @return BladeFile
    */
   public static List<LocalFile> getFiles(List<MultipartFile> files, String dir) {
      return getFiles(files, dir, null, null);
   }
   /**
    * èŽ·å–BladeFile封装类
    *
    * @param files       æ–‡ä»¶é›†åˆ
    * @param path        è·¯å¾„
    * @param virtualPath è™šæ‹Ÿè·¯å¾„
    * @return BladeFile
    */
   public static List<LocalFile> getFiles(List<MultipartFile> files, String dir, String path, String virtualPath) {
      List<LocalFile> list = new ArrayList<>();
      for (MultipartFile file : files) {
         list.add(new LocalFile(file, dir, path, virtualPath));
      }
      return list;
   }
}