> constraintViolations = validator.validate(object, groups);
- if (!constraintViolations.isEmpty())
- {
- throw new ConstraintViolationException(constraintViolations);
- }
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java
deleted file mode 100644
index 68130b9..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileTypeUtils.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package com.ruoyi.common.utils.file;
-
-import java.io.File;
-import org.apache.commons.lang3.StringUtils;
-
-/**
- * 文件类型工具类
- *
- * @author ruoyi
- */
-public class FileTypeUtils
-{
- /**
- * 获取文件类型
- *
- * 例如: ruoyi.txt, 返回: txt
- *
- * @param file 文件名
- * @return 后缀(不含".")
- */
- public static String getFileType(File file)
- {
- if (null == file)
- {
- return StringUtils.EMPTY;
- }
- return getFileType(file.getName());
- }
-
- /**
- * 获取文件类型
- *
- * 例如: ruoyi.txt, 返回: txt
- *
- * @param fileName 文件名
- * @return 后缀(不含".")
- */
- public static String getFileType(String fileName)
- {
- int separatorIndex = fileName.lastIndexOf(".");
- if (separatorIndex < 0)
- {
- return "";
- }
- return fileName.substring(separatorIndex + 1).toLowerCase();
- }
-
- /**
- * 获取文件类型
- *
- * @param photoByte 文件字节码
- * @return 后缀(不含".")
- */
- public static String getFileExtendName(byte[] photoByte)
- {
- String strFileExtendName = "JPG";
- if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
- && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
- {
- strFileExtendName = "GIF";
- }
- else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
- {
- strFileExtendName = "JPG";
- }
- else if ((photoByte[0] == 66) && (photoByte[1] == 77))
- {
- strFileExtendName = "BMP";
- }
- else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
- {
- strFileExtendName = "PNG";
- }
- return strFileExtendName;
- }
-}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
deleted file mode 100644
index d9f2b13..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
+++ /dev/null
@@ -1,232 +0,0 @@
-package com.ruoyi.common.utils.file;
-
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Paths;
-import java.util.Objects;
-import org.apache.commons.io.FilenameUtils;
-import org.springframework.web.multipart.MultipartFile;
-import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.exception.file.FileNameLengthLimitExceededException;
-import com.ruoyi.common.exception.file.FileSizeLimitExceededException;
-import com.ruoyi.common.exception.file.InvalidExtensionException;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.uuid.Seq;
-
-/**
- * 文件上传工具类
- *
- * @author ruoyi
- */
-public class FileUploadUtils
-{
- /**
- * 默认大小 50M
- */
- public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
-
- /**
- * 默认的文件名最大长度 100
- */
- public static final int DEFAULT_FILE_NAME_LENGTH = 100;
-
- /**
- * 默认上传的地址
- */
- private static String defaultBaseDir = RuoYiConfig.getProfile();
-
- public static void setDefaultBaseDir(String defaultBaseDir)
- {
- FileUploadUtils.defaultBaseDir = defaultBaseDir;
- }
-
- public static String getDefaultBaseDir()
- {
- return defaultBaseDir;
- }
-
- /**
- * 以默认配置进行文件上传
- *
- * @param file 上传的文件
- * @return 文件名称
- * @throws Exception
- */
- public static final String upload(MultipartFile file) throws IOException
- {
- try
- {
- return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
- }
- catch (Exception e)
- {
- throw new IOException(e.getMessage(), e);
- }
- }
-
- /**
- * 根据文件路径上传
- *
- * @param baseDir 相对应用的基目录
- * @param file 上传的文件
- * @return 文件名称
- * @throws IOException
- */
- public static final String upload(String baseDir, MultipartFile file) throws IOException
- {
- try
- {
- return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
- }
- catch (Exception e)
- {
- throw new IOException(e.getMessage(), e);
- }
- }
-
- /**
- * 文件上传
- *
- * @param baseDir 相对应用的基目录
- * @param file 上传的文件
- * @param allowedExtension 上传文件类型
- * @return 返回上传成功的文件名
- * @throws FileSizeLimitExceededException 如果超出最大大小
- * @throws FileNameLengthLimitExceededException 文件名太长
- * @throws IOException 比如读写文件出错时
- * @throws InvalidExtensionException 文件校验异常
- */
- public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
- throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
- InvalidExtensionException
- {
- int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
- if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
- {
- throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
- }
-
- assertAllowed(file, allowedExtension);
-
- String fileName = extractFilename(file);
-
- String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
- file.transferTo(Paths.get(absPath));
- return getPathFileName(baseDir, fileName);
- }
-
- /**
- * 编码文件名
- */
- public static final String extractFilename(MultipartFile file)
- {
- return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
- FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
- }
-
- public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
- {
- File desc = new File(uploadDir + File.separator + fileName);
-
- if (!desc.exists())
- {
- if (!desc.getParentFile().exists())
- {
- desc.getParentFile().mkdirs();
- }
- }
- return desc;
- }
-
- public static final String getPathFileName(String uploadDir, String fileName) throws IOException
- {
- int dirLastIndex = RuoYiConfig.getProfile().length() + 1;
- String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
- return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
- }
-
- /**
- * 文件大小校验
- *
- * @param file 上传的文件
- * @return
- * @throws FileSizeLimitExceededException 如果超出最大大小
- * @throws InvalidExtensionException
- */
- public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
- throws FileSizeLimitExceededException, InvalidExtensionException
- {
- long size = file.getSize();
- if (size > DEFAULT_MAX_SIZE)
- {
- throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
- }
-
- String fileName = file.getOriginalFilename();
- String extension = getExtension(file);
- if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
- {
- if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
- {
- throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
- fileName);
- }
- else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
- {
- throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
- fileName);
- }
- else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
- {
- throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
- fileName);
- }
- else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
- {
- throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
- fileName);
- }
- else
- {
- throw new InvalidExtensionException(allowedExtension, extension, fileName);
- }
- }
- }
-
- /**
- * 判断MIME类型是否是允许的MIME类型
- *
- * @param extension
- * @param allowedExtension
- * @return
- */
- public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
- {
- for (String str : allowedExtension)
- {
- if (str.equalsIgnoreCase(extension))
- {
- return true;
- }
- }
- return false;
- }
-
- /**
- * 获取文件名的后缀
- *
- * @param file 表单文件
- * @return 后缀名
- */
- public static final String getExtension(MultipartFile file)
- {
- String extension = FilenameUtils.getExtension(file.getOriginalFilename());
- if (StringUtils.isEmpty(extension))
- {
- extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
- }
- return extension;
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
deleted file mode 100644
index 2062b75..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
+++ /dev/null
@@ -1,291 +0,0 @@
-package com.ruoyi.common.utils.file;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.ArrayUtils;
-import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.uuid.IdUtils;
-import org.apache.commons.io.FilenameUtils;
-
-/**
- * 文件处理工具类
- *
- * @author ruoyi
- */
-public class FileUtils
-{
- public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+";
-
- /**
- * 输出指定文件的byte数组
- *
- * @param filePath 文件路径
- * @param os 输出流
- * @return
- */
- public static void writeBytes(String filePath, OutputStream os) throws IOException
- {
- FileInputStream fis = null;
- try
- {
- File file = new File(filePath);
- if (!file.exists())
- {
- throw new FileNotFoundException(filePath);
- }
- fis = new FileInputStream(file);
- byte[] b = new byte[1024];
- int length;
- while ((length = fis.read(b)) > 0)
- {
- os.write(b, 0, length);
- }
- }
- catch (IOException e)
- {
- throw e;
- }
- finally
- {
- IOUtils.close(os);
- IOUtils.close(fis);
- }
- }
-
- /**
- * 写数据到文件中
- *
- * @param data 数据
- * @return 目标文件
- * @throws IOException IO异常
- */
- public static String writeImportBytes(byte[] data) throws IOException
- {
- return writeBytes(data, RuoYiConfig.getImportPath());
- }
-
- /**
- * 写数据到文件中
- *
- * @param data 数据
- * @param uploadDir 目标文件
- * @return 目标文件
- * @throws IOException IO异常
- */
- public static String writeBytes(byte[] data, String uploadDir) throws IOException
- {
- FileOutputStream fos = null;
- String pathName = "";
- try
- {
- String extension = getFileExtendName(data);
- pathName = DateUtils.datePath() + "/" + IdUtils.fastUUID() + "." + extension;
- File file = FileUploadUtils.getAbsoluteFile(uploadDir, pathName);
- fos = new FileOutputStream(file);
- fos.write(data);
- }
- finally
- {
- IOUtils.close(fos);
- }
- return FileUploadUtils.getPathFileName(uploadDir, pathName);
- }
-
- /**
- * 删除文件
- *
- * @param filePath 文件
- * @return
- */
- public static boolean deleteFile(String filePath)
- {
- boolean flag = false;
- File file = new File(filePath);
- // 路径为文件且不为空则进行删除
- if (file.isFile() && file.exists())
- {
- flag = file.delete();
- }
- return flag;
- }
-
- /**
- * 文件名称验证
- *
- * @param filename 文件名称
- * @return true 正常 false 非法
- */
- public static boolean isValidFilename(String filename)
- {
- return filename.matches(FILENAME_PATTERN);
- }
-
- /**
- * 检查文件是否可下载
- *
- * @param resource 需要下载的文件
- * @return true 正常 false 非法
- */
- public static boolean checkAllowDownload(String resource)
- {
- // 禁止目录上跳级别
- if (StringUtils.contains(resource, ".."))
- {
- return false;
- }
-
- // 检查允许下载的文件规则
- if (ArrayUtils.contains(MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION, FileTypeUtils.getFileType(resource)))
- {
- return true;
- }
-
- // 不在允许下载的文件规则
- return false;
- }
-
- /**
- * 下载文件名重新编码
- *
- * @param request 请求对象
- * @param fileName 文件名
- * @return 编码后的文件名
- */
- public static String setFileDownloadHeader(HttpServletRequest request, String fileName) throws UnsupportedEncodingException
- {
- final String agent = request.getHeader("USER-AGENT");
- String filename = fileName;
- if (agent.contains("MSIE"))
- {
- // IE浏览器
- filename = URLEncoder.encode(filename, "utf-8");
- filename = filename.replace("+", " ");
- }
- else if (agent.contains("Firefox"))
- {
- // 火狐浏览器
- filename = new String(fileName.getBytes(), "ISO8859-1");
- }
- else if (agent.contains("Chrome"))
- {
- // google浏览器
- filename = URLEncoder.encode(filename, "utf-8");
- }
- else
- {
- // 其它浏览器
- filename = URLEncoder.encode(filename, "utf-8");
- }
- return filename;
- }
-
- /**
- * 下载文件名重新编码
- *
- * @param response 响应对象
- * @param realFileName 真实文件名
- */
- public static void setAttachmentResponseHeader(HttpServletResponse response, String realFileName) throws UnsupportedEncodingException
- {
- String percentEncodedFileName = percentEncode(realFileName);
-
- StringBuilder contentDispositionValue = new StringBuilder();
- contentDispositionValue.append("attachment; filename=")
- .append(percentEncodedFileName)
- .append(";")
- .append("filename*=")
- .append("utf-8''")
- .append(percentEncodedFileName);
-
- response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");
- response.setHeader("Content-disposition", contentDispositionValue.toString());
- response.setHeader("download-filename", percentEncodedFileName);
- }
-
- /**
- * 百分号编码工具方法
- *
- * @param s 需要百分号编码的字符串
- * @return 百分号编码后的字符串
- */
- public static String percentEncode(String s) throws UnsupportedEncodingException
- {
- String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());
- return encode.replaceAll("\\+", "%20");
- }
-
- /**
- * 获取图像后缀
- *
- * @param photoByte 图像数据
- * @return 后缀名
- */
- public static String getFileExtendName(byte[] photoByte)
- {
- String strFileExtendName = "jpg";
- if ((photoByte[0] == 71) && (photoByte[1] == 73) && (photoByte[2] == 70) && (photoByte[3] == 56)
- && ((photoByte[4] == 55) || (photoByte[4] == 57)) && (photoByte[5] == 97))
- {
- strFileExtendName = "gif";
- }
- else if ((photoByte[6] == 74) && (photoByte[7] == 70) && (photoByte[8] == 73) && (photoByte[9] == 70))
- {
- strFileExtendName = "jpg";
- }
- else if ((photoByte[0] == 66) && (photoByte[1] == 77))
- {
- strFileExtendName = "bmp";
- }
- else if ((photoByte[1] == 80) && (photoByte[2] == 78) && (photoByte[3] == 71))
- {
- strFileExtendName = "png";
- }
- return strFileExtendName;
- }
-
- /**
- * 获取文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi.png
- *
- * @param fileName 路径名称
- * @return 没有文件路径的名称
- */
- public static String getName(String fileName)
- {
- if (fileName == null)
- {
- return null;
- }
- int lastUnixPos = fileName.lastIndexOf('/');
- int lastWindowsPos = fileName.lastIndexOf('\\');
- int index = Math.max(lastUnixPos, lastWindowsPos);
- return fileName.substring(index + 1);
- }
-
- /**
- * 获取不带后缀文件名称 /profile/upload/2022/04/16/ruoyi.png -- ruoyi
- *
- * @param fileName 路径名称
- * @return 没有文件路径和后缀的名称
- */
- public static String getNameNotSuffix(String fileName)
- {
- if (fileName == null)
- {
- return null;
- }
- String baseName = FilenameUtils.getBaseName(fileName);
- return baseName;
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java
deleted file mode 100644
index 432dfda..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/ImageUtils.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package com.ruoyi.common.utils.file;
-
-import java.io.ByteArrayInputStream;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Arrays;
-import org.apache.poi.util.IOUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.utils.StringUtils;
-
-/**
- * 图片处理工具类
- *
- * @author ruoyi
- */
-public class ImageUtils
-{
- private static final Logger log = LoggerFactory.getLogger(ImageUtils.class);
-
- public static byte[] getImage(String imagePath)
- {
- InputStream is = getFile(imagePath);
- try
- {
- return IOUtils.toByteArray(is);
- }
- catch (Exception e)
- {
- log.error("图片加载异常 {}", e);
- return null;
- }
- finally
- {
- IOUtils.closeQuietly(is);
- }
- }
-
- public static InputStream getFile(String imagePath)
- {
- try
- {
- byte[] result = readFile(imagePath);
- result = Arrays.copyOf(result, result.length);
- return new ByteArrayInputStream(result);
- }
- catch (Exception e)
- {
- log.error("获取图片异常 {}", e);
- }
- return null;
- }
-
- /**
- * 读取文件为字节数据
- *
- * @param url 地址
- * @return 字节数据
- */
- public static byte[] readFile(String url)
- {
- InputStream in = null;
- try
- {
- if (url.startsWith("http"))
- {
- // 网络地址
- URL urlObj = new URL(url);
- URLConnection urlConnection = urlObj.openConnection();
- urlConnection.setConnectTimeout(30 * 1000);
- urlConnection.setReadTimeout(60 * 1000);
- urlConnection.setDoInput(true);
- in = urlConnection.getInputStream();
- }
- else
- {
- // 本机地址
- String localPath = RuoYiConfig.getProfile();
- String downloadPath = localPath + StringUtils.substringAfter(url, Constants.RESOURCE_PREFIX);
- in = new FileInputStream(downloadPath);
- }
- return IOUtils.toByteArray(in);
- }
- catch (Exception e)
- {
- log.error("获取文件路径异常 {}", e);
- return null;
- }
- finally
- {
- IOUtils.closeQuietly(in);
- }
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
deleted file mode 100644
index f968f1a..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/file/MimeTypeUtils.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.ruoyi.common.utils.file;
-
-/**
- * 媒体类型工具类
- *
- * @author ruoyi
- */
-public class MimeTypeUtils
-{
- public static final String IMAGE_PNG = "image/png";
-
- public static final String IMAGE_JPG = "image/jpg";
-
- public static final String IMAGE_JPEG = "image/jpeg";
-
- public static final String IMAGE_BMP = "image/bmp";
-
- public static final String IMAGE_GIF = "image/gif";
-
- public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" };
-
- public static final String[] FLASH_EXTENSION = { "swf", "flv" };
-
- public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg",
- "asf", "rm", "rmvb" };
-
- public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" };
-
- public static final String[] DEFAULT_ALLOWED_EXTENSION = {
- // 图片
- "bmp", "gif", "jpg", "jpeg", "png",
- // word excel powerpoint
- "doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt",
- // 压缩文件
- "rar", "zip", "gz", "bz2",
- // 视频格式
- "mp4", "avi", "rmvb",
- // pdf
- "pdf" };
-
- public static String getExtension(String prefix)
- {
- switch (prefix)
- {
- case IMAGE_PNG:
- return "png";
- case IMAGE_JPG:
- return "jpg";
- case IMAGE_JPEG:
- return "jpeg";
- case IMAGE_BMP:
- return "bmp";
- case IMAGE_GIF:
- return "gif";
- default:
- return "";
- }
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java
deleted file mode 100644
index f52e83e..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/EscapeUtil.java
+++ /dev/null
@@ -1,167 +0,0 @@
-package com.ruoyi.common.utils.html;
-
-import com.ruoyi.common.utils.StringUtils;
-
-/**
- * 转义和反转义工具类
- *
- * @author ruoyi
- */
-public class EscapeUtil
-{
- public static final String RE_HTML_MARK = "(<[^<]*?>)|(<[\\s]*?/[^<]*?>)|(<[^<]*?/[\\s]*?>)";
-
- private static final char[][] TEXT = new char[64][];
-
- static
- {
- for (int i = 0; i < 64; i++)
- {
- TEXT[i] = new char[] { (char) i };
- }
-
- // special HTML characters
- TEXT['\''] = "'".toCharArray(); // 单引号
- TEXT['"'] = """.toCharArray(); // 双引号
- TEXT['&'] = "&".toCharArray(); // &符
- TEXT['<'] = "<".toCharArray(); // 小于号
- TEXT['>'] = ">".toCharArray(); // 大于号
- }
-
- /**
- * 转义文本中的HTML字符为安全的字符
- *
- * @param text 被转义的文本
- * @return 转义后的文本
- */
- public static String escape(String text)
- {
- return encode(text);
- }
-
- /**
- * 还原被转义的HTML特殊字符
- *
- * @param content 包含转义符的HTML内容
- * @return 转换后的字符串
- */
- public static String unescape(String content)
- {
- return decode(content);
- }
-
- /**
- * 清除所有HTML标签,但是不删除标签内的内容
- *
- * @param content 文本
- * @return 清除标签后的文本
- */
- public static String clean(String content)
- {
- return new HTMLFilter().filter(content);
- }
-
- /**
- * Escape编码
- *
- * @param text 被编码的文本
- * @return 编码后的字符
- */
- private static String encode(String text)
- {
- if (StringUtils.isEmpty(text))
- {
- return StringUtils.EMPTY;
- }
-
- final StringBuilder tmp = new StringBuilder(text.length() * 6);
- char c;
- for (int i = 0; i < text.length(); i++)
- {
- c = text.charAt(i);
- if (c < 256)
- {
- tmp.append("%");
- if (c < 16)
- {
- tmp.append("0");
- }
- tmp.append(Integer.toString(c, 16));
- }
- else
- {
- tmp.append("%u");
- if (c <= 0xfff)
- {
- // issue#I49JU8@Gitee
- tmp.append("0");
- }
- tmp.append(Integer.toString(c, 16));
- }
- }
- return tmp.toString();
- }
-
- /**
- * Escape解码
- *
- * @param content 被转义的内容
- * @return 解码后的字符串
- */
- public static String decode(String content)
- {
- if (StringUtils.isEmpty(content))
- {
- return content;
- }
-
- StringBuilder tmp = new StringBuilder(content.length());
- int lastPos = 0, pos = 0;
- char ch;
- while (lastPos < content.length())
- {
- pos = content.indexOf("%", lastPos);
- if (pos == lastPos)
- {
- if (content.charAt(pos + 1) == 'u')
- {
- ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);
- tmp.append(ch);
- lastPos = pos + 6;
- }
- else
- {
- ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);
- tmp.append(ch);
- lastPos = pos + 3;
- }
- }
- else
- {
- if (pos == -1)
- {
- tmp.append(content.substring(lastPos));
- lastPos = content.length();
- }
- else
- {
- tmp.append(content.substring(lastPos, pos));
- lastPos = pos;
- }
- }
- }
- return tmp.toString();
- }
-
- public static void main(String[] args)
- {
- String html = "";
- String escape = EscapeUtil.escape(html);
- // String html = "ipt>alert(\"XSS\")ipt>";
- // String html = "<123";
- // String html = "123>";
- System.out.println("clean: " + EscapeUtil.clean(html));
- System.out.println("escape: " + escape);
- System.out.println("unescape: " + EscapeUtil.unescape(escape));
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java
deleted file mode 100644
index ebff3fd..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/html/HTMLFilter.java
+++ /dev/null
@@ -1,570 +0,0 @@
-package com.ruoyi.common.utils.html;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * HTML过滤器,用于去除XSS漏洞隐患。
- *
- * @author ruoyi
- */
-public final class HTMLFilter
-{
- /**
- * regex flag union representing /si modifiers in php
- **/
- private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;
- private static final Pattern P_COMMENTS = Pattern.compile("", Pattern.DOTALL);
- private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);
- private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);
- private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);
- private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);
- private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);
- private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);
- private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);
- private static final Pattern P_ENTITY = Pattern.compile("(\\d+);?");
- private static final Pattern P_ENTITY_UNICODE = Pattern.compile("([0-9a-f]+);?");
- private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");
- private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");
- private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);
- private static final Pattern P_END_ARROW = Pattern.compile("^>");
- private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");
- private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");
- private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");
- private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");
- private static final Pattern P_AMP = Pattern.compile("&");
- private static final Pattern P_QUOTE = Pattern.compile("\"");
- private static final Pattern P_LEFT_ARROW = Pattern.compile("<");
- private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");
- private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");
-
- // @xxx could grow large... maybe use sesat's ReferenceMap
- private static final ConcurrentMap P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>();
- private static final ConcurrentMap P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>();
-
- /**
- * set of allowed html elements, along with allowed attributes for each element
- **/
- private final Map> vAllowed;
- /**
- * counts of open tags for each (allowable) html element
- **/
- private final Map vTagCounts = new HashMap<>();
-
- /**
- * html elements which must always be self-closing (e.g. "")
- **/
- private final String[] vSelfClosingTags;
- /**
- * html elements which must always have separate opening and closing tags (e.g. "")
- **/
- private final String[] vNeedClosingTags;
- /**
- * set of disallowed html elements
- **/
- private final String[] vDisallowed;
- /**
- * attributes which should be checked for valid protocols
- **/
- private final String[] vProtocolAtts;
- /**
- * allowed protocols
- **/
- private final String[] vAllowedProtocols;
- /**
- * tags which should be removed if they contain no content (e.g. "" or "")
- **/
- private final String[] vRemoveBlanks;
- /**
- * entities allowed within html markup
- **/
- private final String[] vAllowedEntities;
- /**
- * flag determining whether comments are allowed in input String.
- */
- private final boolean stripComment;
- private final boolean encodeQuotes;
- /**
- * flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. ""
- * becomes " text "). If set to false, unbalanced angle brackets will be html escaped.
- */
- private final boolean alwaysMakeTags;
-
- /**
- * Default constructor.
- */
- public HTMLFilter()
- {
- vAllowed = new HashMap<>();
-
- final ArrayList a_atts = new ArrayList<>();
- a_atts.add("href");
- a_atts.add("target");
- vAllowed.put("a", a_atts);
-
- final ArrayList img_atts = new ArrayList<>();
- img_atts.add("src");
- img_atts.add("width");
- img_atts.add("height");
- img_atts.add("alt");
- vAllowed.put("img", img_atts);
-
- final ArrayList no_atts = new ArrayList<>();
- vAllowed.put("b", no_atts);
- vAllowed.put("strong", no_atts);
- vAllowed.put("i", no_atts);
- vAllowed.put("em", no_atts);
-
- vSelfClosingTags = new String[] { "img" };
- vNeedClosingTags = new String[] { "a", "b", "strong", "i", "em" };
- vDisallowed = new String[] {};
- vAllowedProtocols = new String[] { "http", "mailto", "https" }; // no ftp.
- vProtocolAtts = new String[] { "src", "href" };
- vRemoveBlanks = new String[] { "a", "b", "strong", "i", "em" };
- vAllowedEntities = new String[] { "amp", "gt", "lt", "quot" };
- stripComment = true;
- encodeQuotes = true;
- alwaysMakeTags = false;
- }
-
- /**
- * Map-parameter configurable constructor.
- *
- * @param conf map containing configuration. keys match field names.
- */
- @SuppressWarnings("unchecked")
- public HTMLFilter(final Map conf)
- {
-
- assert conf.containsKey("vAllowed") : "configuration requires vAllowed";
- assert conf.containsKey("vSelfClosingTags") : "configuration requires vSelfClosingTags";
- assert conf.containsKey("vNeedClosingTags") : "configuration requires vNeedClosingTags";
- assert conf.containsKey("vDisallowed") : "configuration requires vDisallowed";
- assert conf.containsKey("vAllowedProtocols") : "configuration requires vAllowedProtocols";
- assert conf.containsKey("vProtocolAtts") : "configuration requires vProtocolAtts";
- assert conf.containsKey("vRemoveBlanks") : "configuration requires vRemoveBlanks";
- assert conf.containsKey("vAllowedEntities") : "configuration requires vAllowedEntities";
-
- vAllowed = Collections.unmodifiableMap((HashMap>) conf.get("vAllowed"));
- vSelfClosingTags = (String[]) conf.get("vSelfClosingTags");
- vNeedClosingTags = (String[]) conf.get("vNeedClosingTags");
- vDisallowed = (String[]) conf.get("vDisallowed");
- vAllowedProtocols = (String[]) conf.get("vAllowedProtocols");
- vProtocolAtts = (String[]) conf.get("vProtocolAtts");
- vRemoveBlanks = (String[]) conf.get("vRemoveBlanks");
- vAllowedEntities = (String[]) conf.get("vAllowedEntities");
- stripComment = conf.containsKey("stripComment") ? (Boolean) conf.get("stripComment") : true;
- encodeQuotes = conf.containsKey("encodeQuotes") ? (Boolean) conf.get("encodeQuotes") : true;
- alwaysMakeTags = conf.containsKey("alwaysMakeTags") ? (Boolean) conf.get("alwaysMakeTags") : true;
- }
-
- private void reset()
- {
- vTagCounts.clear();
- }
-
- // ---------------------------------------------------------------
- // my versions of some PHP library functions
- public static String chr(final int decimal)
- {
- return String.valueOf((char) decimal);
- }
-
- public static String htmlSpecialChars(final String s)
- {
- String result = s;
- result = regexReplace(P_AMP, "&", result);
- result = regexReplace(P_QUOTE, """, result);
- result = regexReplace(P_LEFT_ARROW, "<", result);
- result = regexReplace(P_RIGHT_ARROW, ">", result);
- return result;
- }
-
- // ---------------------------------------------------------------
-
- /**
- * given a user submitted input String, filter out any invalid or restricted html.
- *
- * @param input text (i.e. submitted by a user) than may contain html
- * @return "clean" version of input, with only valid, whitelisted html elements allowed
- */
- public String filter(final String input)
- {
- reset();
- String s = input;
-
- s = escapeComments(s);
-
- s = balanceHTML(s);
-
- s = checkTags(s);
-
- s = processRemoveBlanks(s);
-
- // s = validateEntities(s);
-
- return s;
- }
-
- public boolean isAlwaysMakeTags()
- {
- return alwaysMakeTags;
- }
-
- public boolean isStripComments()
- {
- return stripComment;
- }
-
- private String escapeComments(final String s)
- {
- final Matcher m = P_COMMENTS.matcher(s);
- final StringBuffer buf = new StringBuffer();
- if (m.find())
- {
- final String match = m.group(1); // (.*?)
- m.appendReplacement(buf, Matcher.quoteReplacement(""));
- }
- m.appendTail(buf);
-
- return buf.toString();
- }
-
- private String balanceHTML(String s)
- {
- if (alwaysMakeTags)
- {
- //
- // try and form html
- //
- s = regexReplace(P_END_ARROW, "", s);
- // 不追加结束标签
- s = regexReplace(P_BODY_TO_END, "<$1>", s);
- s = regexReplace(P_XML_CONTENT, "$1<$2", s);
-
- }
- else
- {
- //
- // escape stray brackets
- //
- s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s);
- s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s);
-
- //
- // the last regexp causes '<>' entities to appear
- // (we need to do a lookahead assertion so that the last bracket can
- // be used in the next pass of the regexp)
- //
- s = regexReplace(P_BOTH_ARROWS, "", s);
- }
-
- return s;
- }
-
- private String checkTags(String s)
- {
- Matcher m = P_TAGS.matcher(s);
-
- final StringBuffer buf = new StringBuffer();
- while (m.find())
- {
- String replaceStr = m.group(1);
- replaceStr = processTag(replaceStr);
- m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));
- }
- m.appendTail(buf);
-
- // these get tallied in processTag
- // (remember to reset before subsequent calls to filter method)
- final StringBuilder sBuilder = new StringBuilder(buf.toString());
- for (String key : vTagCounts.keySet())
- {
- for (int ii = 0; ii < vTagCounts.get(key); ii++)
- {
- sBuilder.append("").append(key).append(">");
- }
- }
- s = sBuilder.toString();
-
- return s;
- }
-
- private String processRemoveBlanks(final String s)
- {
- String result = s;
- for (String tag : vRemoveBlanks)
- {
- if (!P_REMOVE_PAIR_BLANKS.containsKey(tag))
- {
- P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?>" + tag + ">"));
- }
- result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);
- if (!P_REMOVE_SELF_BLANKS.containsKey(tag))
- {
- P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));
- }
- result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);
- }
-
- return result;
- }
-
- private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s)
- {
- Matcher m = regex_pattern.matcher(s);
- return m.replaceAll(replacement);
- }
-
- private String processTag(final String s)
- {
- // ending tags
- Matcher m = P_END_TAG.matcher(s);
- if (m.find())
- {
- final String name = m.group(1).toLowerCase();
- if (allowed(name))
- {
- if (!inArray(name, vSelfClosingTags))
- {
- if (vTagCounts.containsKey(name))
- {
- vTagCounts.put(name, vTagCounts.get(name) - 1);
- return "" + name + ">";
- }
- }
- }
- }
-
- // starting tags
- m = P_START_TAG.matcher(s);
- if (m.find())
- {
- final String name = m.group(1).toLowerCase();
- final String body = m.group(2);
- String ending = m.group(3);
-
- // debug( "in a starting tag, name='" + name + "'; body='" + body + "'; ending='" + ending + "'" );
- if (allowed(name))
- {
- final StringBuilder params = new StringBuilder();
-
- final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);
- final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);
- final List paramNames = new ArrayList<>();
- final List paramValues = new ArrayList<>();
- while (m2.find())
- {
- paramNames.add(m2.group(1)); // ([a-z0-9]+)
- paramValues.add(m2.group(3)); // (.*?)
- }
- while (m3.find())
- {
- paramNames.add(m3.group(1)); // ([a-z0-9]+)
- paramValues.add(m3.group(3)); // ([^\"\\s']+)
- }
-
- String paramName, paramValue;
- for (int ii = 0; ii < paramNames.size(); ii++)
- {
- paramName = paramNames.get(ii).toLowerCase();
- paramValue = paramValues.get(ii);
-
- // debug( "paramName='" + paramName + "'" );
- // debug( "paramValue='" + paramValue + "'" );
- // debug( "allowed? " + vAllowed.get( name ).contains( paramName ) );
-
- if (allowedAttribute(name, paramName))
- {
- if (inArray(paramName, vProtocolAtts))
- {
- paramValue = processParamProtocol(paramValue);
- }
- params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\\\"");
- }
- }
-
- if (inArray(name, vSelfClosingTags))
- {
- ending = " /";
- }
-
- if (inArray(name, vNeedClosingTags))
- {
- ending = "";
- }
-
- if (ending == null || ending.length() < 1)
- {
- if (vTagCounts.containsKey(name))
- {
- vTagCounts.put(name, vTagCounts.get(name) + 1);
- }
- else
- {
- vTagCounts.put(name, 1);
- }
- }
- else
- {
- ending = " /";
- }
- return "<" + name + params + ending + ">";
- }
- else
- {
- return "";
- }
- }
-
- // comments
- m = P_COMMENT.matcher(s);
- if (!stripComment && m.find())
- {
- return "<" + m.group() + ">";
- }
-
- return "";
- }
-
- private String processParamProtocol(String s)
- {
- s = decodeEntities(s);
- final Matcher m = P_PROTOCOL.matcher(s);
- if (m.find())
- {
- final String protocol = m.group(1);
- if (!inArray(protocol, vAllowedProtocols))
- {
- // bad protocol, turn into local anchor link instead
- s = "#" + s.substring(protocol.length() + 1);
- if (s.startsWith("#//"))
- {
- s = "#" + s.substring(3);
- }
- }
- }
-
- return s;
- }
-
- private String decodeEntities(String s)
- {
- StringBuffer buf = new StringBuffer();
-
- Matcher m = P_ENTITY.matcher(s);
- while (m.find())
- {
- final String match = m.group(1);
- final int decimal = Integer.decode(match).intValue();
- m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
- }
- m.appendTail(buf);
- s = buf.toString();
-
- buf = new StringBuffer();
- m = P_ENTITY_UNICODE.matcher(s);
- while (m.find())
- {
- final String match = m.group(1);
- final int decimal = Integer.valueOf(match, 16).intValue();
- m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
- }
- m.appendTail(buf);
- s = buf.toString();
-
- buf = new StringBuffer();
- m = P_ENCODE.matcher(s);
- while (m.find())
- {
- final String match = m.group(1);
- final int decimal = Integer.valueOf(match, 16).intValue();
- m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));
- }
- m.appendTail(buf);
- s = buf.toString();
-
- s = validateEntities(s);
- return s;
- }
-
- private String validateEntities(final String s)
- {
- StringBuffer buf = new StringBuffer();
-
- // validate entities throughout the string
- Matcher m = P_VALID_ENTITIES.matcher(s);
- while (m.find())
- {
- final String one = m.group(1); // ([^&;]*)
- final String two = m.group(2); // (?=(;|&|$))
- m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));
- }
- m.appendTail(buf);
-
- return encodeQuotes(buf.toString());
- }
-
- private String encodeQuotes(final String s)
- {
- if (encodeQuotes)
- {
- StringBuffer buf = new StringBuffer();
- Matcher m = P_VALID_QUOTES.matcher(s);
- while (m.find())
- {
- final String one = m.group(1); // (>|^)
- final String two = m.group(2); // ([^<]+?)
- final String three = m.group(3); // (<|$)
- // 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two)
- m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three));
- }
- m.appendTail(buf);
- return buf.toString();
- }
- else
- {
- return s;
- }
- }
-
- private String checkEntity(final String preamble, final String term)
- {
-
- return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble;
- }
-
- private boolean isValidEntity(final String entity)
- {
- return inArray(entity, vAllowedEntities);
- }
-
- private static boolean inArray(final String s, final String[] array)
- {
- for (String item : array)
- {
- if (item != null && item.equals(s))
- {
- return true;
- }
- }
- return false;
- }
-
- private boolean allowed(final String name)
- {
- return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);
- }
-
- private boolean allowedAttribute(final String name, final String paramName)
- {
- return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));
- }
-}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java
deleted file mode 100644
index 401f25a..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpHelper.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package com.ruoyi.common.utils.http;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
-import jakarta.servlet.ServletRequest;
-import org.apache.commons.lang3.exception.ExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * 通用http工具封装
- *
- * @author ruoyi
- */
-public class HttpHelper
-{
- private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class);
-
- public static String getBodyString(ServletRequest request)
- {
- StringBuilder sb = new StringBuilder();
- BufferedReader reader = null;
- try (InputStream inputStream = request.getInputStream())
- {
- reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
- String line = "";
- while ((line = reader.readLine()) != null)
- {
- sb.append(line);
- }
- }
- catch (IOException e)
- {
- LOGGER.warn("getBodyString出现问题!");
- }
- finally
- {
- if (reader != null)
- {
- try
- {
- reader.close();
- }
- catch (IOException e)
- {
- LOGGER.error(ExceptionUtils.getMessage(e));
- }
- }
- }
- return sb.toString();
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
deleted file mode 100644
index f85c82c..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/http/HttpUtils.java
+++ /dev/null
@@ -1,274 +0,0 @@
-package com.ruoyi.common.utils.http;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.net.ConnectException;
-import java.net.SocketTimeoutException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.nio.charset.StandardCharsets;
-import java.security.cert.X509Certificate;
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.utils.StringUtils;
-
-/**
- * 通用http发送方法
- *
- * @author ruoyi
- */
-public class HttpUtils
-{
- private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
-
- /**
- * 向指定 URL 发送GET方法的请求
- *
- * @param url 发送请求的 URL
- * @return 所代表远程资源的响应结果
- */
- public static String sendGet(String url)
- {
- return sendGet(url, StringUtils.EMPTY);
- }
-
- /**
- * 向指定 URL 发送GET方法的请求
- *
- * @param url 发送请求的 URL
- * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
- * @return 所代表远程资源的响应结果
- */
- public static String sendGet(String url, String param)
- {
- return sendGet(url, param, Constants.UTF8);
- }
-
- /**
- * 向指定 URL 发送GET方法的请求
- *
- * @param url 发送请求的 URL
- * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
- * @param contentType 编码类型
- * @return 所代表远程资源的响应结果
- */
- public static String sendGet(String url, String param, String contentType)
- {
- StringBuilder result = new StringBuilder();
- BufferedReader in = null;
- try
- {
- String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url;
- log.info("sendGet - {}", urlNameString);
- URL realUrl = new URL(urlNameString);
- URLConnection connection = realUrl.openConnection();
- connection.setRequestProperty("accept", "*/*");
- connection.setRequestProperty("connection", "Keep-Alive");
- connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
- connection.connect();
- in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType));
- String line;
- while ((line = in.readLine()) != null)
- {
- result.append(line);
- }
- log.info("recv - {}", result);
- }
- catch (ConnectException e)
- {
- log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);
- }
- catch (SocketTimeoutException e)
- {
- log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);
- }
- catch (IOException e)
- {
- log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);
- }
- catch (Exception e)
- {
- log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);
- }
- finally
- {
- try
- {
- if (in != null)
- {
- in.close();
- }
- }
- catch (Exception ex)
- {
- log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
- }
- }
- return result.toString();
- }
-
- /**
- * 向指定 URL 发送POST方法的请求
- *
- * @param url 发送请求的 URL
- * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
- * @return 所代表远程资源的响应结果
- */
- public static String sendPost(String url, String param)
- {
- PrintWriter out = null;
- BufferedReader in = null;
- StringBuilder result = new StringBuilder();
- try
- {
- log.info("sendPost - {}", url);
- URL realUrl = new URL(url);
- URLConnection conn = realUrl.openConnection();
- conn.setRequestProperty("accept", "*/*");
- conn.setRequestProperty("connection", "Keep-Alive");
- conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
- conn.setRequestProperty("Accept-Charset", "utf-8");
- conn.setRequestProperty("contentType", "utf-8");
- conn.setDoOutput(true);
- conn.setDoInput(true);
- out = new PrintWriter(conn.getOutputStream());
- out.print(param);
- out.flush();
- in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
- String line;
- while ((line = in.readLine()) != null)
- {
- result.append(line);
- }
- log.info("recv - {}", result);
- }
- catch (ConnectException e)
- {
- log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
- }
- catch (SocketTimeoutException e)
- {
- log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
- }
- catch (IOException e)
- {
- log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
- }
- catch (Exception e)
- {
- log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
- }
- finally
- {
- try
- {
- if (out != null)
- {
- out.close();
- }
- if (in != null)
- {
- in.close();
- }
- }
- catch (IOException ex)
- {
- log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
- }
- }
- return result.toString();
- }
-
- public static String sendSSLPost(String url, String param)
- {
- StringBuilder result = new StringBuilder();
- String urlNameString = url + "?" + param;
- try
- {
- log.info("sendSSLPost - {}", urlNameString);
- SSLContext sc = SSLContext.getInstance("SSL");
- sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom());
- URL console = new URL(urlNameString);
- HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
- conn.setRequestProperty("accept", "*/*");
- conn.setRequestProperty("connection", "Keep-Alive");
- conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
- conn.setRequestProperty("Accept-Charset", "utf-8");
- conn.setRequestProperty("contentType", "utf-8");
- conn.setDoOutput(true);
- conn.setDoInput(true);
-
- conn.setSSLSocketFactory(sc.getSocketFactory());
- conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
- conn.connect();
- InputStream is = conn.getInputStream();
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- String ret = "";
- while ((ret = br.readLine()) != null)
- {
- if (ret != null && !"".equals(ret.trim()))
- {
- result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
- }
- }
- log.info("recv - {}", result);
- conn.disconnect();
- br.close();
- }
- catch (ConnectException e)
- {
- log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
- }
- catch (SocketTimeoutException e)
- {
- log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
- }
- catch (IOException e)
- {
- log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
- }
- catch (Exception e)
- {
- log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
- }
- return result.toString();
- }
-
- private static class TrustAnyTrustManager implements X509TrustManager
- {
- @Override
- public void checkClientTrusted(X509Certificate[] chain, String authType)
- {
- }
-
- @Override
- public void checkServerTrusted(X509Certificate[] chain, String authType)
- {
- }
-
- @Override
- public X509Certificate[] getAcceptedIssuers()
- {
- return new X509Certificate[] {};
- }
- }
-
- private static class TrustAnyHostnameVerifier implements HostnameVerifier
- {
- @Override
- public boolean verify(String hostname, SSLSession session)
- {
- return true;
- }
- }
-}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java
deleted file mode 100644
index edfe419..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/AddressUtils.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.ruoyi.common.utils.ip;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
-import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.http.HttpUtils;
-
-/**
- * 获取地址类
- *
- * @author ruoyi
- */
-public class AddressUtils
-{
- private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);
-
- // IP地址查询
- public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";
-
- // 未知地址
- public static final String UNKNOWN = "XX XX";
-
- public static String getRealAddressByIP(String ip)
- {
- // 内网不查询
- if (IpUtils.internalIp(ip))
- {
- return "内网IP";
- }
- if (RuoYiConfig.isAddressEnabled())
- {
- try
- {
- String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK);
- if (StringUtils.isEmpty(rspStr))
- {
- log.error("获取地理位置异常 {}", ip);
- return UNKNOWN;
- }
- JSONObject obj = JSON.parseObject(rspStr);
- String region = obj.getString("pro");
- String city = obj.getString("city");
- return String.format("%s %s", region, city);
- }
- catch (Exception e)
- {
- log.error("获取地理位置异常 {}", ip);
- }
- }
- return UNKNOWN;
- }
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java
deleted file mode 100644
index a376416..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/ip/IpUtils.java
+++ /dev/null
@@ -1,382 +0,0 @@
-package com.ruoyi.common.utils.ip;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import jakarta.servlet.http.HttpServletRequest;
-import com.ruoyi.common.utils.ServletUtils;
-import com.ruoyi.common.utils.StringUtils;
-
-/**
- * 获取IP方法
- *
- * @author ruoyi
- */
-public class IpUtils
-{
- public final static String REGX_0_255 = "(25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
- // 匹配 ip
- public final static String REGX_IP = "((" + REGX_0_255 + "\\.){3}" + REGX_0_255 + ")";
- public final static String REGX_IP_WILDCARD = "(((\\*\\.){3}\\*)|(" + REGX_0_255 + "(\\.\\*){3})|(" + REGX_0_255 + "\\." + REGX_0_255 + ")(\\.\\*){2}" + "|((" + REGX_0_255 + "\\.){3}\\*))";
- // 匹配网段
- public final static String REGX_IP_SEG = "(" + REGX_IP + "\\-" + REGX_IP + ")";
-
- /**
- * 获取客户端IP
- *
- * @return IP地址
- */
- public static String getIpAddr()
- {
- return getIpAddr(ServletUtils.getRequest());
- }
-
- /**
- * 获取客户端IP
- *
- * @param request 请求对象
- * @return IP地址
- */
- public static String getIpAddr(HttpServletRequest request)
- {
- if (request == null)
- {
- return "unknown";
- }
- String ip = request.getHeader("x-forwarded-for");
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
- {
- ip = request.getHeader("Proxy-Client-IP");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
- {
- ip = request.getHeader("X-Forwarded-For");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
- {
- ip = request.getHeader("WL-Proxy-Client-IP");
- }
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
- {
- ip = request.getHeader("X-Real-IP");
- }
-
- if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))
- {
- ip = request.getRemoteAddr();
- }
-
- return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
- }
-
- /**
- * 检查是否为内部IP地址
- *
- * @param ip IP地址
- * @return 结果
- */
- public static boolean internalIp(String ip)
- {
- byte[] addr = textToNumericFormatV4(ip);
- return internalIp(addr) || "127.0.0.1".equals(ip);
- }
-
- /**
- * 检查是否为内部IP地址
- *
- * @param addr byte地址
- * @return 结果
- */
- private static boolean internalIp(byte[] addr)
- {
- if (StringUtils.isNull(addr) || addr.length < 2)
- {
- return true;
- }
- final byte b0 = addr[0];
- final byte b1 = addr[1];
- // 10.x.x.x/8
- final byte SECTION_1 = 0x0A;
- // 172.16.x.x/12
- final byte SECTION_2 = (byte) 0xAC;
- final byte SECTION_3 = (byte) 0x10;
- final byte SECTION_4 = (byte) 0x1F;
- // 192.168.x.x/16
- final byte SECTION_5 = (byte) 0xC0;
- final byte SECTION_6 = (byte) 0xA8;
- switch (b0)
- {
- case SECTION_1:
- return true;
- case SECTION_2:
- if (b1 >= SECTION_3 && b1 <= SECTION_4)
- {
- return true;
- }
- case SECTION_5:
- switch (b1)
- {
- case SECTION_6:
- return true;
- }
- default:
- return false;
- }
- }
-
- /**
- * 将IPv4地址转换成字节
- *
- * @param text IPv4地址
- * @return byte 字节
- */
- public static byte[] textToNumericFormatV4(String text)
- {
- if (text.length() == 0)
- {
- return null;
- }
-
- byte[] bytes = new byte[4];
- String[] elements = text.split("\\.", -1);
- try
- {
- long l;
- int i;
- switch (elements.length)
- {
- case 1:
- l = Long.parseLong(elements[0]);
- if ((l < 0L) || (l > 4294967295L))
- {
- return null;
- }
- bytes[0] = (byte) (int) (l >> 24 & 0xFF);
- bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
- bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
- bytes[3] = (byte) (int) (l & 0xFF);
- break;
- case 2:
- l = Integer.parseInt(elements[0]);
- if ((l < 0L) || (l > 255L))
- {
- return null;
- }
- bytes[0] = (byte) (int) (l & 0xFF);
- l = Integer.parseInt(elements[1]);
- if ((l < 0L) || (l > 16777215L))
- {
- return null;
- }
- bytes[1] = (byte) (int) (l >> 16 & 0xFF);
- bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
- bytes[3] = (byte) (int) (l & 0xFF);
- break;
- case 3:
- for (i = 0; i < 2; ++i)
- {
- l = Integer.parseInt(elements[i]);
- if ((l < 0L) || (l > 255L))
- {
- return null;
- }
- bytes[i] = (byte) (int) (l & 0xFF);
- }
- l = Integer.parseInt(elements[2]);
- if ((l < 0L) || (l > 65535L))
- {
- return null;
- }
- bytes[2] = (byte) (int) (l >> 8 & 0xFF);
- bytes[3] = (byte) (int) (l & 0xFF);
- break;
- case 4:
- for (i = 0; i < 4; ++i)
- {
- l = Integer.parseInt(elements[i]);
- if ((l < 0L) || (l > 255L))
- {
- return null;
- }
- bytes[i] = (byte) (int) (l & 0xFF);
- }
- break;
- default:
- return null;
- }
- }
- catch (NumberFormatException e)
- {
- return null;
- }
- return bytes;
- }
-
- /**
- * 获取IP地址
- *
- * @return 本地IP地址
- */
- public static String getHostIp()
- {
- try
- {
- return InetAddress.getLocalHost().getHostAddress();
- }
- catch (UnknownHostException e)
- {
- }
- return "127.0.0.1";
- }
-
- /**
- * 获取主机名
- *
- * @return 本地主机名
- */
- public static String getHostName()
- {
- try
- {
- return InetAddress.getLocalHost().getHostName();
- }
- catch (UnknownHostException e)
- {
- }
- return "未知";
- }
-
- /**
- * 从多级反向代理中获得第一个非unknown IP地址
- *
- * @param ip 获得的IP地址
- * @return 第一个非unknown IP地址
- */
- public static String getMultistageReverseProxyIp(String ip)
- {
- // 多级反向代理检测
- if (ip != null && ip.indexOf(",") > 0)
- {
- final String[] ips = ip.trim().split(",");
- for (String subIp : ips)
- {
- if (false == isUnknown(subIp))
- {
- ip = subIp;
- break;
- }
- }
- }
- return StringUtils.substring(ip, 0, 255);
- }
-
- /**
- * 检测给定字符串是否为未知,多用于检测HTTP请求相关
- *
- * @param checkString 被检测的字符串
- * @return 是否未知
- */
- public static boolean isUnknown(String checkString)
- {
- return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
- }
-
- /**
- * 是否为IP
- */
- public static boolean isIP(String ip)
- {
- return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP);
- }
-
- /**
- * 是否为IP,或 *为间隔的通配符地址
- */
- public static boolean isIpWildCard(String ip)
- {
- return StringUtils.isNotBlank(ip) && ip.matches(REGX_IP_WILDCARD);
- }
-
- /**
- * 检测参数是否在ip通配符里
- */
- public static boolean ipIsInWildCardNoCheck(String ipWildCard, String ip)
- {
- String[] s1 = ipWildCard.split("\\.");
- String[] s2 = ip.split("\\.");
- boolean isMatchedSeg = true;
- for (int i = 0; i < s1.length && !s1[i].equals("*"); i++)
- {
- if (!s1[i].equals(s2[i]))
- {
- isMatchedSeg = false;
- break;
- }
- }
- return isMatchedSeg;
- }
-
- /**
- * 是否为特定格式如:“10.10.10.1-10.10.10.99”的ip段字符串
- */
- public static boolean isIPSegment(String ipSeg)
- {
- return StringUtils.isNotBlank(ipSeg) && ipSeg.matches(REGX_IP_SEG);
- }
-
- /**
- * 判断ip是否在指定网段中
- */
- public static boolean ipIsInNetNoCheck(String iparea, String ip)
- {
- int idx = iparea.indexOf('-');
- String[] sips = iparea.substring(0, idx).split("\\.");
- String[] sipe = iparea.substring(idx + 1).split("\\.");
- String[] sipt = ip.split("\\.");
- long ips = 0L, ipe = 0L, ipt = 0L;
- for (int i = 0; i < 4; ++i)
- {
- ips = ips << 8 | Integer.parseInt(sips[i]);
- ipe = ipe << 8 | Integer.parseInt(sipe[i]);
- ipt = ipt << 8 | Integer.parseInt(sipt[i]);
- }
- if (ips > ipe)
- {
- long t = ips;
- ips = ipe;
- ipe = t;
- }
- return ips <= ipt && ipt <= ipe;
- }
-
- /**
- * 校验ip是否符合过滤串规则
- *
- * @param filter 过滤IP列表,支持后缀'*'通配,支持网段如:`10.10.10.1-10.10.10.99`
- * @param ip 校验IP地址
- * @return boolean 结果
- */
- public static boolean isMatchedIp(String filter, String ip)
- {
- if (StringUtils.isEmpty(filter) || StringUtils.isEmpty(ip))
- {
- return false;
- }
- String[] ips = filter.split(";");
- for (String iStr : ips)
- {
- if (isIP(iStr) && iStr.equals(ip))
- {
- return true;
- }
- else if (isIpWildCard(iStr) && ipIsInWildCardNoCheck(iStr, ip))
- {
- return true;
- }
- else if (isIPSegment(iStr) && ipIsInNetNoCheck(iStr, ip))
- {
- return true;
- }
- }
- return false;
- }
-}
\ No newline at end of file
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java
deleted file mode 100644
index 5ea74c1..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.ruoyi.common.utils.poi;
-
-/**
- * Excel数据格式处理适配器
- *
- * @author ruoyi
- */
-public interface ExcelHandlerAdapter
-{
- /**
- * 格式化
- *
- * @param value 单元格数据值
- * @param args excel注解args参数组
- *
- * @return 处理后的值
- */
- Object format(Object value, String[] args);
-}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
deleted file mode 100644
index 5e678c8..0000000
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
+++ /dev/null
@@ -1,1745 +0,0 @@
-package com.ruoyi.common.utils.poi;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.math.BigDecimal;
-import java.text.DecimalFormat;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.stream.Collectors;
-import jakarta.servlet.http.HttpServletResponse;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.RegExUtils;
-import org.apache.commons.lang3.reflect.FieldUtils;
-import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
-import org.apache.poi.hssf.usermodel.HSSFPicture;
-import org.apache.poi.hssf.usermodel.HSSFPictureData;
-import org.apache.poi.hssf.usermodel.HSSFShape;
-import org.apache.poi.hssf.usermodel.HSSFSheet;
-import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ooxml.POIXMLDocumentPart;
-import org.apache.poi.ss.usermodel.BorderStyle;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellStyle;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.ClientAnchor;
-import org.apache.poi.ss.usermodel.DataValidation;
-import org.apache.poi.ss.usermodel.DataValidationConstraint;
-import org.apache.poi.ss.usermodel.DataValidationHelper;
-import org.apache.poi.ss.usermodel.DateUtil;
-import org.apache.poi.ss.usermodel.Drawing;
-import org.apache.poi.ss.usermodel.FillPatternType;
-import org.apache.poi.ss.usermodel.Font;
-import org.apache.poi.ss.usermodel.HorizontalAlignment;
-import org.apache.poi.ss.usermodel.IndexedColors;
-import org.apache.poi.ss.usermodel.Name;
-import org.apache.poi.ss.usermodel.PictureData;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.VerticalAlignment;
-import org.apache.poi.ss.usermodel.Workbook;
-import org.apache.poi.ss.usermodel.WorkbookFactory;
-import org.apache.poi.ss.util.CellRangeAddress;
-import org.apache.poi.ss.util.CellRangeAddressList;
-import org.apache.poi.util.IOUtils;
-import org.apache.poi.xssf.streaming.SXSSFWorkbook;
-import org.apache.poi.xssf.usermodel.XSSFClientAnchor;
-import org.apache.poi.xssf.usermodel.XSSFDataValidation;
-import org.apache.poi.xssf.usermodel.XSSFDrawing;
-import org.apache.poi.xssf.usermodel.XSSFPicture;
-import org.apache.poi.xssf.usermodel.XSSFShape;
-import org.apache.poi.xssf.usermodel.XSSFSheet;
-import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTMarker;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import com.ruoyi.common.annotation.Excel;
-import com.ruoyi.common.annotation.Excel.ColumnType;
-import com.ruoyi.common.annotation.Excel.Type;
-import com.ruoyi.common.annotation.Excels;
-import com.ruoyi.common.config.RuoYiConfig;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.text.Convert;
-import com.ruoyi.common.exception.UtilException;
-import com.ruoyi.common.utils.DateUtils;
-import com.ruoyi.common.utils.DictUtils;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.file.FileTypeUtils;
-import com.ruoyi.common.utils.file.FileUtils;
-import com.ruoyi.common.utils.file.ImageUtils;
-import com.ruoyi.common.utils.reflect.ReflectUtils;
-
-/**
- * Excel相关处理
- *
- * @author ruoyi
- */
-public class ExcelUtil
-{
- private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
-
- public static final String FORMULA_REGEX_STR = "=|-|\\+|@";
-
- public static final String[] FORMULA_STR = { "=", "-", "+", "@" };
-
- /**
- * 用于dictType属性数据存储,避免重复查缓存
- */
- public Map sysDictMap = new HashMap();
-
- /**
- * Excel sheet最大行数,默认65536
- */
- public static final int sheetSize = 65536;
-
- /**
- * 工作表名称
- */
- private String sheetName;
-
- /**
- * 导出类型(EXPORT:导出数据;IMPORT:导入模板)
- */
- private Type type;
-
- /**
- * 工作薄对象
- */
- private Workbook wb;
-
- /**
- * 工作表对象
- */
- private Sheet sheet;
-
- /**
- * 样式列表
- */
- private Map styles;
-
- /**
- * 导入导出数据列表
- */
- private List list;
-
- /**
- * 注解列表
- */
- private List