/* * 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 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 getFiles(List files) { return getFiles(files, "image", null, null); } /** * 获取BladeFile封装类 * * @param files 文件集合 * @param dir 目录 * @return BladeFile */ public static List getFiles(List files, String dir) { return getFiles(files, dir, null, null); } /** * 获取BladeFile封装类 * * @param files 文件集合 * @param path 路径 * @param virtualPath 虚拟路径 * @return BladeFile */ public static List getFiles(List files, String dir, String path, String virtualPath) { List list = new ArrayList<>(); for (MultipartFile file : files) { list.add(new LocalFile(file, dir, path, virtualPath)); } return list; } }