fileList = listDeepFiles(srcFile);
fos = new FileOutputStream(zipFile);
zos = new ZipOutputStream(new BufferedOutputStream(fos));
// 将每个文件放入zip流中
for (File file : fileList) {
- String name = getRealName(sourcePath, file); // 获取文件相对路径,保持文件原有结构
+ String name = FileHandler.getRealName(srcPath, file); // 获取文件相对路径,保持文件原有结构
ZipEntry zipEntry = null;
if (isKeepFolder) {
- zipEntry = new ZipEntry(new File(sourcePath).getName() + File.separator + name);
+ zipEntry = new ZipEntry(new File(srcPath).getName() + File.separator + name);
} else {
zipEntry = new ZipEntry(name);
}
@@ -675,12 +582,8 @@ public class FileUtils {
}
zos.close();
}
- } catch (FileNotFoundException e) {
- throw new FileNotFoundException("待压缩的文件或目录不存在:" + sourcePath);
} catch (IOException e) {
throw new IOException(e);
- } catch (Exception e) {
- throw new Exception(e);
} finally {
IOUtils.closeQuietly(zos);
IOUtils.closeQuietly(fos);
@@ -691,20 +594,18 @@ public class FileUtils {
/**
* zip解压
- * @param zipPath zip文件的绝对路径,例如:D:\\Temp\\xx.zip
- * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Tempxx
- * @throws Exception
+ * @param zipPath zip文件的绝对路径,例如:D:\\Temp\\xx.zip
+ * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Temp
+ * @throws IOException
*/
- public static void unZip(String zipPath, String destDirPath) throws Exception {
+ public static void unZip(String zipPath, String destDirPath) throws IOException {
+ File file = new File(zipPath);
+ FileHandler.requireFile(file);
+
byte[] buffer = new byte[1024*10];
ZipFile zipFile = null;
try {
- File file = new File(zipPath);
- if (!file.exists()) {
- throw new FileNotFoundException("待解压的文件不存在:" + zipPath);
- }
-
zipFile = new ZipFile(zipPath);
Enumeration> entries = zipFile.entries();
while (entries.hasMoreElements()) {
@@ -736,15 +637,216 @@ public class FileUtils {
in.close();
}
}
- } catch (FileNotFoundException e) {
- throw new FileNotFoundException("待解压的文件不存在:" + zipPath);
} catch (IOException e) {
throw new IOException(e);
- } catch (Exception e) {
- throw new Exception(e);
} finally {
IOUtils.closeQuietly(zipFile);
}
}
+ /**
+ * 下载resources文件夹下的文件(不重命名)
+ * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx
+ */
+ public static void downloadFileFromResource(String filePath) {
+ downloadFileFromResource(filePath, null);
+ }
+
+ /**
+ * 下载resources文件夹下的文件
+ * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx
+ * @param newFileName 重命名文件名称(带后缀)
+ */
+ public static void downloadFileFromResource(String filePath, String newFileName) {
+ if (newFileName==null || newFileName.length()==0) {
+ newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
+ }
+
+ InputStream in = PathUtils.getInputStreamFromResource(filePath);
+ downloadFile(in, newFileName);
+ }
+
+ /**
+ * 下载文件(InputStream流)
+ * @param in InputStream流
+ * @param newFileName 重命名文件名称(带后缀)
+ */
+ public static void downloadFile(InputStream in, String newFileName) {
+ HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+
+ OutputStream out = null;
+
+ try {
+ response.setContentType("application/octet-stream");
+ newFileName = java.net.URLEncoder.encode(newFileName, "UTF-8");
+ response.setHeader("Content-disposition", "attachment; filename=" + newFileName);
+ out = response.getOutputStream();
+
+ int b = 0;
+ byte[] buffer = new byte[BUFFER_SIZE];
+ while ((b = in.read(buffer)) != -1) {
+ out.write(buffer, 0, b);
+ }
+
+ out.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ IOUtils.closeQuietly(out);
+ IOUtils.closeQuietly(in);
+ }
+ }
+
+ /**
+ * 下载文件(不重命名)
+ * @param filePath 文件的路径(带具体的文件名)
+ * 如果是相对路径,则认为是项目的同级目录
+ * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径
+ */
+ public static void downloadFile(String filePath) {
+ downloadFile(filePath, null);
+ }
+
+ /**
+ * 下载文件(重命名)
+ * @param filePath 文件的路径(带具体的文件名)
+ * 如果是相对路径,则认为是项目的同级目录
+ * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径
+ * @param newFileName 重命名文件名称(带后缀)
+ */
+ public static void downloadFile(String filePath, String newFileName) {
+ HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
+
+ // 传入的路径是否是绝对路径
+ boolean isAbsolutePath = PathUtils.isAbsolutePath(filePath);
+ // 存储文件的物理路径
+ String fileAbsolutePath = "";
+ if (isAbsolutePath) {
+ fileAbsolutePath = filePath;
+ } else {
+ String projectPath = PathUtils.getProjectPath();
+ fileAbsolutePath = projectPath + File.separator + filePath;
+ }
+
+ File file = new File(fileAbsolutePath);
+ if (newFileName==null || newFileName.length()==0) {
+ newFileName = file.getName();
+ }
+
+ BufferedInputStream bis = null;
+ BufferedOutputStream bos = null;
+
+ try {
+ response.setContentType("application/octet-stream");
+ response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(newFileName, "UTF-8"));
+ response.setHeader("Content-Length", String.valueOf(file.length()));
+
+ bis = new BufferedInputStream(new FileInputStream(file));
+ bos = new BufferedOutputStream(response.getOutputStream());
+ byte[] buff = new byte[BUFFER_SIZE];
+ while (true) {
+ int bytesRead;
+
+ if (-1 == (bytesRead=bis.read(buff, 0, buff.length))) {
+ break;
+ }
+
+ bos.write(buff, 0, bytesRead);
+ }
+
+ bos.flush();
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ IOUtils.closeQuietly(bos);
+ IOUtils.closeQuietly(bis);
+ }
+ }
+
+ /**
+ * 获取文件的后缀
+ *
+ * foo.txt --> "txt"
+ * a/b/c.jpg --> "jpg"
+ * a/b.txt/c --> ""
+ * a/b/c --> ""
+ *
+ * @param fileName
+ * @return
+ */
+ public static String getExtension(String fileName) {
+ if (StringUtils.isEmpty(fileName)) {
+ return fileName;
+ }
+
+ // 如果是Linux下的特殊文件后缀,则直接返回
+ for (String specialExtension : SPECIAL_EXTENSION) {
+ if (fileName.endsWith(EXTENSION_SEPARATOR_STR + specialExtension)) {
+ return specialExtension;
+ }
+ }
+
+ final int index = FilenameHandler.indexOfExtension(fileName);
+ if (index == NOT_FOUND) {
+ return EMPTY_STRING;
+ }
+ return fileName.substring(index + 1);
+ }
+
+ /**
+ * 获取文件的名称,不包括文件后缀和文件路径
+ *
+ * a/b/c.txt --> c
+ * a.txt --> a
+ * a/b/c --> c
+ * a/b/c/ --> ""
+ *
+ * @param fileName
+ * @return
+ */
+ public static String getBaseName(String fileName) {
+ fileName = FilenameHandler.getName(fileName);
+ String extension = getExtension(fileName);
+
+ return fileName.replace(EXTENSION_SEPARATOR_STR + extension, "");
+ }
+
+ /**
+ * 返回文件全名(返回最后一个正斜杠或反斜杠之后的文本)
+ *
+ * a/b/c.txt --> c.txt
+ * a.txt --> a.txt
+ * a/b/c --> c
+ * a/b/c/ --> ""
+ *
+ * @param fileName
+ * @return
+ */
+ public static String getName(String fileName) {
+ if (StringUtils.isEmpty(fileName)) {
+ return fileName;
+ }
+
+ final int index = FilenameHandler.indexOfLastSeparator(fileName);
+ return fileName.substring(index + 1);
+ }
+
+ /**
+ * 获取文件路径,不包括文件名
+ *
+ *
+ * C:\a\b\c.txt --> C:\a\b\
+ * a.txt --> ""
+ * a/b/c --> a/b/
+ *
+ *
+ * @param fileName
+ * @return
+ */
+ public static String getFullPath(String fileName) {
+ String name = getName(fileName);
+ int indexOf = fileName.indexOf(name);
+ return fileName.substring(0, indexOf);
+ }
+
}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java
index 814c557..904e3bc 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java
@@ -13,6 +13,7 @@ import java.io.Writer;
import java.nio.charset.Charset;
import java.util.Objects;
+import cn.javaex.htool.core.io.handler.FileHandler;
import cn.javaex.htool.core.io.output.StringBuilderWriter;
/**
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHandler.java
similarity index 90%
rename from htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java
rename to htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHandler.java
index 21cbf6b..56abd2a 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileHandler.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHandler.java
@@ -1,4 +1,4 @@
-package cn.javaex.htool.core.io;
+package cn.javaex.htool.core.io.handler;
import java.io.File;
import java.io.FileNotFoundException;
@@ -29,10 +29,9 @@ public class FileHandler {
/**
* 要求给定的文件存在并且是一个目录
* @param directory 待校验的目录对象
- * @param name 异常消息中使用的参数名称
* @return
*/
- public static File requireDirectoryExists(File directory, String name) {
+ public static File requireDirectoryExists(File directory) {
requireExists(directory);
requireDirectory(directory);
return directory;
@@ -52,7 +51,7 @@ public class FileHandler {
}
/**
- * 要求文件必须存在
+ * 要求文件或目录必须存在
* @param file
* @return
*/
@@ -92,7 +91,7 @@ public class FileHandler {
}
/**
- * 校验是否是一个文件,不是则报错
+ * 要求file必须存在,且是一个文件,而不是目录
* @param file
* @return
*/
@@ -152,7 +151,7 @@ public class FileHandler {
}
/**
- * 要求给定的文件必须存在,且是一个文件,而不是目录
+ * 要求给定的文件如果存在,就必须是一个文件,而不是目录
* @param file
* @return
*/
@@ -215,6 +214,16 @@ public class FileHandler {
break;
}
- return limitSize >= fileSizeCom;
+ return limitSize > fileSizeCom;
}
+
+ /**
+ * 得到文件在文件夹中的相对路径,保持原有结构
+ * @param srcPath
+ * @param file
+ * @return
+ */
+ public static String getRealName(String srcPath, File file) {
+ return file.getAbsolutePath().replace(srcPath + File.separator, "").replace(srcPath, "");
+ }
}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java
new file mode 100644
index 0000000..cc0c4ab
--- /dev/null
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java
@@ -0,0 +1,85 @@
+package cn.javaex.htool.core.io.handler;
+
+import java.io.File;
+import java.util.regex.Pattern;
+
+/**
+ * 文件帮助类
+ *
+ * @author 陈霓清
+ * @Date 2022年12月8日
+ */
+public class FileHelper {
+ /**
+ * 文件扩展分隔符(字符)
+ */
+ public static final char EXTENSION_SEPARATOR = '.';
+
+ /**
+ * 文件扩展分隔符(字符串)
+ */
+ public static final String EXTENSION_SEPARATOR_STR = ".";
+
+ /**
+ * Unix分隔符
+ */
+ protected static final char UNIX_SEPARATOR = '/';
+
+ /**
+ * Windows分隔符
+ */
+ protected static final char WINDOWS_SEPARATOR = '\\';
+
+ /**
+ * 系统分隔符
+ */
+ protected static final char SYSTEM_SEPARATOR = File.separatorChar;
+
+ /**
+ * 与系统分隔符相反的分隔符
+ */
+ protected static final char OTHER_SEPARATOR;
+
+ /**
+ * 空数组
+ */
+ protected static final String[] EMPTY_STRING_ARRAY = {};
+
+ /**
+ * 空字符串
+ */
+ protected static final String EMPTY_STRING = "";
+
+ /**
+ * 未找到
+ */
+ protected static final int NOT_FOUND = -1;
+
+ /**
+ * 特殊的文件扩展名
+ */
+ protected static final String[] SPECIAL_EXTENSION = {"tar.gz", "tar.bz2", "tar.Z", "tar.xz"};
+
+ /**
+ * Windows下文件名中被禁止的字符
+ */
+ protected static final Pattern INVALID_FILENAME_WINDOWS = Pattern.compile("[\\\\/:*?\"<>|\r\n]");
+
+ static {
+ if (isWindowsSystem()) {
+ OTHER_SEPARATOR = UNIX_SEPARATOR;
+ } else {
+ OTHER_SEPARATOR = WINDOWS_SEPARATOR;
+ }
+ }
+
+ /**
+ * 是否是windows系统
+ *
+ * @return
+ */
+ protected static boolean isWindowsSystem() {
+ return SYSTEM_SEPARATOR == WINDOWS_SEPARATOR;
+ }
+
+}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FilenameHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FilenameHandler.java
new file mode 100644
index 0000000..9c8d99f
--- /dev/null
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FilenameHandler.java
@@ -0,0 +1,64 @@
+package cn.javaex.htool.core.io.handler;
+
+import cn.javaex.htool.core.string.StringUtils;
+
+/**
+ * 文件名处理
+ *
+ * @author 陈霓清
+ * @Date 2022年12月8日
+ */
+public class FilenameHandler extends FileHelper {
+
+ /**
+ * 返回文件后缀的索引
+ *
+ * @param fileName
+ * @return
+ */
+ public static int indexOfExtension(String fileName) {
+ if (fileName == null) {
+ return -1;
+ }
+
+ // 正常的文件后缀索引
+ final int extensionPos = fileName.lastIndexOf(EXTENSION_SEPARATOR);
+ // 非正常的文件后缀索引
+ // 例如 https://webimg.javaex.cn/FiPZlaXnGeqvJYV1CtH3yGbBVH_i
+ // 例如 D:\\test\\1
+ final int lastSeparator = indexOfLastSeparator(fileName);
+
+ return lastSeparator > extensionPos ? NOT_FOUND : extensionPos;
+ }
+
+ /**
+ * 获取系统分隔符的索引
+ *
+ * @param fileName
+ * @return
+ */
+ public static int indexOfLastSeparator(String fileName) {
+ if (fileName == null) {
+ return NOT_FOUND;
+ }
+ final int lastUnixPos = fileName.lastIndexOf(UNIX_SEPARATOR);
+ final int lastWindowsPos = fileName.lastIndexOf(WINDOWS_SEPARATOR);
+ return Math.max(lastUnixPos, lastWindowsPos);
+ }
+
+ /**
+ * 获取完整的文件名称,去除文件路径 a/b/c.txt -> c.txt
+ *
+ * @param fileName
+ * @return
+ */
+ public static String getName(String fileName) {
+ if (StringUtils.isEmpty(fileName)) {
+ return fileName;
+ }
+
+ int index = FilenameHandler.indexOfLastSeparator(fileName);
+ return fileName.substring(index + 1);
+ }
+
+}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/model/TreeFile.java b/htool-core/src/main/java/cn/javaex/htool/core/io/model/TreeFile.java
new file mode 100644
index 0000000..85e4696
--- /dev/null
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/model/TreeFile.java
@@ -0,0 +1,23 @@
+package cn.javaex.htool.core.io.model;
+
+import java.io.File;
+import java.util.List;
+
+public class TreeFile {
+ private File file;
+ private List children;
+
+ public File getFile() {
+ return file;
+ }
+ public void setFile(File file) {
+ this.file = file;
+ }
+ public List getChildren() {
+ return children;
+ }
+ public void setChildren(List children) {
+ this.children = children;
+ }
+
+}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java
index f967862..023d158 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java
@@ -606,7 +606,7 @@ public class StringUtils {
}
/**
- * 中间为*
+ * 中间的字符替换为*
* @param str 指定的字符串
* @param start 显示开头几位
* @param end 显示结尾几位
@@ -632,4 +632,32 @@ public class StringUtils {
return str;
}
+ /**
+ * 删除字符串中的第一个字符
+ *
+ * @param str
+ * @return
+ */
+ public static String removeFirstChar(String str) {
+ if (str==null || str.length()==0) {
+ return str;
+ }
+
+ return str.substring(1);
+ }
+
+ /**
+ * 删除字符串中的最后一个字符
+ *
+ * @param str
+ * @return
+ */
+ public static String removeLastChar(String str) {
+ if (str==null || str.length()==0) {
+ return str;
+ }
+
+ return str.substring(0, str.length() - 1);
+ }
+
}
diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java
index 43be9a3..eee852f 100644
--- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java
+++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java
@@ -115,7 +115,7 @@ public class PictureUtils {
ImageWriteParam imageWriteParam = writer.getDefaultWriteParam();
ColorModel colorModel = srcBuffer.getColorModel();
try {
- String uuid = IdUtils.getUuid();
+ String uuid = IdUtils.getUUID();
File tempFile = File.createTempFile("quality_" + uuid, ".jpg");
FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(fileOutputStream);
--
Gitee
From 70ebc249d5ab4c8904f0badd2d1a078197936432 Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Mon, 2 Jan 2023 19:29:05 +0800
Subject: [PATCH 30/44] 20230102
---
htool-http/pom.xml | 13 --------
.../javaex/htool/http/servlet/AgentUtils.java | 27 ++++++---------
.../htool/http/servlet/CookieUtils.java | 33 +++++++------------
.../htool/http/servlet/SessionUtils.java | 23 ++++++-------
4 files changed, 32 insertions(+), 64 deletions(-)
diff --git a/htool-http/pom.xml b/htool-http/pom.xml
index c15a68b..e2e53f6 100644
--- a/htool-http/pom.xml
+++ b/htool-http/pom.xml
@@ -10,19 +10,6 @@
http模块
-
- javax.servlet
- javax.servlet-api
- 4.0.1
- provided
-
-
- org.springframework
- spring-webmvc
- 5.3.18
- provided
-
-
eu.bitwalker
UserAgentUtils
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java
index 520d430..1dd6a26 100644
--- a/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java
+++ b/htool-http/src/main/java/cn/javaex/htool/http/servlet/AgentUtils.java
@@ -1,12 +1,10 @@
package cn.javaex.htool.http.servlet;
+import javax.servlet.http.HttpServletRequest;
+
import eu.bitwalker.useragentutils.Browser;
import eu.bitwalker.useragentutils.OperatingSystem;
import eu.bitwalker.useragentutils.UserAgent;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
-import javax.servlet.http.HttpServletRequest;
/**
* 获取终端信息
@@ -28,12 +26,10 @@ public class AgentUtils {
/**
* 获取访问者的ip地址
- *
+ * @param request
* @return
*/
- public static String getIp() {
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-
+ public static String getIp(HttpServletRequest request) {
if (request == null) {
return UNKNOWN;
}
@@ -75,11 +71,10 @@ public class AgentUtils {
/**
* 判断访问来路是否是移动端
- *
+ * @param request
* @return
*/
- public static boolean isMoblie() {
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ public static boolean isMoblie(HttpServletRequest request) {
String userAgent = request.getHeader("user-agent");
if (userAgent.indexOf(ANDROID) != -1 || userAgent.indexOf(IPHONE) != -1 || userAgent.indexOf(IPAD) != -1) {
@@ -91,11 +86,10 @@ public class AgentUtils {
/**
* 获取访问者浏览器
- *
+ * @param request
* @return
*/
- public static String getBrowser() {
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ public static String getBrowser(HttpServletRequest request) {
String userAgent = request.getHeader("user-agent");
if (userAgent.contains(MICROSOFT_EDGE)) {
@@ -108,11 +102,10 @@ public class AgentUtils {
/**
* 获取访问者操作系统
- *
+ * @param request
* @return
*/
- public static String getOperatingSystem() {
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
+ public static String getOperatingSystem(HttpServletRequest request) {
String userAgent = request.getHeader("user-agent");
OperatingSystem operatingSystem = UserAgent.parseUserAgentString(userAgent).getOperatingSystem();
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java
index 2341e43..a435b9d 100644
--- a/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java
+++ b/htool-http/src/main/java/cn/javaex/htool/http/servlet/CookieUtils.java
@@ -9,9 +9,6 @@ import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
/**
* Cookie工具类
*
@@ -22,13 +19,12 @@ public class CookieUtils {
/**
* 设置Cookie
+ * @param response
* @param name
* @param value
* @param expiry : 过期失效时间,单位:秒
*/
- public static void setCookie(String name, String value, int expiry) {
- HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
-
+ public static void setCookie(HttpServletResponse response, String name, String value, int expiry) {
Cookie addCookie = new Cookie(name, value);
addCookie.setMaxAge(expiry);
addCookie.setPath("/");
@@ -37,14 +33,13 @@ public class CookieUtils {
/**
* 设置Cookie
+ * @param response
* @param name
* @param value
* @param expiry : 过期失效时间,单位:秒
* @param domain : 域名,例如 javaex.cn
*/
- public static void setCookie(String name, String value, int expiry, String domain) {
- HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
-
+ public static void setCookie(HttpServletResponse response, String name, String value, int expiry, String domain) {
Cookie addCookie = new Cookie(name, value);
addCookie.setMaxAge(expiry);
addCookie.setPath("/");
@@ -54,12 +49,11 @@ public class CookieUtils {
/**
* 获取指定名称的cookie
+ * @param request
* @param name
* @return
*/
- public static String getCookie(String name) {
- HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
-
+ public static String getCookie(HttpServletRequest request, String name) {
Cookie[] cookieArr = request.getCookies();
if (cookieArr!=null && cookieArr.length>0) {
for (int i=0; i getCookieList() {
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-
+ public static List getCookieList(HttpServletRequest request) {
List cookieList = new ArrayList<>();
Cookie[] cookies = request.getCookies();
if (cookies==null || cookies.length==0) {
@@ -99,11 +92,10 @@ public class CookieUtils {
/**
* 删除Cookie
+ * @param response
* @param name
*/
- public static void deleteCookie(String name) {
- HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
-
+ public static void deleteCookie(HttpServletResponse response, String name) {
Cookie deleteCookie = new Cookie(name, "");
deleteCookie.setPath("/");
deleteCookie.setMaxAge(0);
@@ -112,12 +104,11 @@ public class CookieUtils {
/**
* 删除Cookie
+ * @param response
* @param name
* @param domain : 域名,例如 javaex.cn
*/
- public static void deleteCookie(String name, String domain) {
- HttpServletResponse response = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getResponse();
-
+ public static void deleteCookie(HttpServletResponse response, String name, String domain) {
Cookie deleteCookie = new Cookie(name, "");
deleteCookie.setPath("/");
deleteCookie.setMaxAge(0);
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java
index 694fd47..764a4cf 100644
--- a/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java
+++ b/htool-http/src/main/java/cn/javaex/htool/http/servlet/SessionUtils.java
@@ -3,9 +3,6 @@ package cn.javaex.htool.http.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
/**
* Session工具类
*
@@ -16,30 +13,29 @@ public class SessionUtils {
/**
* 设置session
+ * @param request
* @param name
* @param value
*/
- public static void setSession(String name, Object value) {
- HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
-
+ public static void setSession(HttpServletRequest request, String name, Object value) {
request.getSession().setAttribute(name, value);
}
/**
* 删除session
+ * @param request
* @param name
*/
- public static void deleteSession(String name) {
- HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
-
+ public static void deleteSession(HttpServletRequest request, String name) {
request.getSession().removeAttribute(name);
}
/**
* 获取sessionId
+ * @param request
+ * @return
*/
- public static String getSessionId() {
- HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
+ public static String getSessionId(HttpServletRequest request) {
HttpSession session = request.getSession();
return session.getId();
@@ -47,12 +43,13 @@ public class SessionUtils {
/**
* 获取session
+ * @param
+ * @param request
* @param name
* @return
*/
@SuppressWarnings("unchecked")
- public static T getSession(String name) {
- HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
+ public static T getSession(HttpServletRequest request, String name) {
HttpSession session = request.getSession();
return (T) session.getAttribute(name);
--
Gitee
From e83526185785bc594441cd0b3be769b66a3ac1d7 Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Mon, 2 Jan 2023 19:29:54 +0800
Subject: [PATCH 31/44] 20230102
---
htool-http/pom.xml | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/htool-http/pom.xml b/htool-http/pom.xml
index e2e53f6..bac0e02 100644
--- a/htool-http/pom.xml
+++ b/htool-http/pom.xml
@@ -10,6 +10,13 @@
http模块
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+ provided
+
+
eu.bitwalker
UserAgentUtils
--
Gitee
From 0ca576e0a2c9ffd791f2f10ce42dca3d0d2bf4c2 Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Mon, 2 Jan 2023 19:56:12 +0800
Subject: [PATCH 32/44] 20230102
---
htool-core/pom.xml | 6 ----
.../cn/javaex/htool/core/io/FileUtils.java | 31 ++++++++-----------
.../PathHandler.java} | 20 +++++-------
.../cn/javaex/htool/core/string/ZHUtils.java | 4 +--
4 files changed, 23 insertions(+), 38 deletions(-)
rename htool-core/src/main/java/cn/javaex/htool/core/io/{PathUtils.java => handler/PathHandler.java} (76%)
diff --git a/htool-core/pom.xml b/htool-core/pom.xml
index 9bbe29a..020b947 100644
--- a/htool-core/pom.xml
+++ b/htool-core/pom.xml
@@ -14,11 +14,5 @@
4.0.1
provided
-
- org.springframework
- spring-webmvc
- 5.3.18
- provided
-
\ No newline at end of file
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
index e902031..aa6d6e7 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
@@ -19,14 +19,13 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
+import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
import cn.javaex.htool.core.io.handler.FileHandler;
import cn.javaex.htool.core.io.handler.FileHelper;
import cn.javaex.htool.core.io.handler.FilenameHandler;
+import cn.javaex.htool.core.io.handler.PathHandler;
import cn.javaex.htool.core.io.model.TreeFile;
import cn.javaex.htool.core.string.StringUtils;
@@ -648,8 +647,8 @@ public class FileUtils extends FileHelper {
* 下载resources文件夹下的文件(不重命名)
* @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx
*/
- public static void downloadFileFromResource(String filePath) {
- downloadFileFromResource(filePath, null);
+ public static void downloadFileFromResource(HttpServletResponse response, String filePath) {
+ downloadFileFromResource(response, filePath, null);
}
/**
@@ -657,13 +656,13 @@ public class FileUtils extends FileHelper {
* @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx
* @param newFileName 重命名文件名称(带后缀)
*/
- public static void downloadFileFromResource(String filePath, String newFileName) {
+ public static void downloadFileFromResource(HttpServletResponse response, String filePath, String newFileName) {
if (newFileName==null || newFileName.length()==0) {
newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
}
- InputStream in = PathUtils.getInputStreamFromResource(filePath);
- downloadFile(in, newFileName);
+ InputStream in = PathHandler.getInputStreamFromResource(filePath);
+ downloadFile(response, in, newFileName);
}
/**
@@ -671,9 +670,7 @@ public class FileUtils extends FileHelper {
* @param in InputStream流
* @param newFileName 重命名文件名称(带后缀)
*/
- public static void downloadFile(InputStream in, String newFileName) {
- HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
-
+ public static void downloadFile(HttpServletResponse response, InputStream in, String newFileName) {
OutputStream out = null;
try {
@@ -703,8 +700,8 @@ public class FileUtils extends FileHelper {
* 如果是相对路径,则认为是项目的同级目录
* 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径
*/
- public static void downloadFile(String filePath) {
- downloadFile(filePath, null);
+ public static void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath) {
+ downloadFile(request, response, filePath, null);
}
/**
@@ -714,17 +711,15 @@ public class FileUtils extends FileHelper {
* 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径
* @param newFileName 重命名文件名称(带后缀)
*/
- public static void downloadFile(String filePath, String newFileName) {
- HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
-
+ public static void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath, String newFileName) {
// 传入的路径是否是绝对路径
- boolean isAbsolutePath = PathUtils.isAbsolutePath(filePath);
+ boolean isAbsolutePath = PathHandler.isAbsolutePath(filePath);
// 存储文件的物理路径
String fileAbsolutePath = "";
if (isAbsolutePath) {
fileAbsolutePath = filePath;
} else {
- String projectPath = PathUtils.getProjectPath();
+ String projectPath = PathHandler.getProjectPath(request);
fileAbsolutePath = projectPath + File.separator + filePath;
}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/PathUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java
similarity index 76%
rename from htool-core/src/main/java/cn/javaex/htool/core/io/PathUtils.java
rename to htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java
index f605cb8..5a4f69c 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/PathUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java
@@ -1,20 +1,17 @@
-package cn.javaex.htool.core.io;
+package cn.javaex.htool.core.io.handler;
import java.io.File;
import java.io.InputStream;
import javax.servlet.http.HttpServletRequest;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
-
/***
* 路径工具类
*
* @author 陈霓清
* @Date 2022年12月1日
*/
-public class PathUtils {
+public class PathHandler {
/**
* 路径转换
@@ -37,10 +34,11 @@ public class PathUtils {
/**
* 获取项目所在磁盘的文件夹路径,并设置临时目录
+ * @param request
* @return
*/
- public static String getFolderPath() {
- String projectPath = getProjectPath();
+ public static String getFolderPath(HttpServletRequest request) {
+ String projectPath = getProjectPath(request);
String folderPath = projectPath + File.separator + "temp_download";
File file = new File(folderPath);
file.mkdirs();
@@ -52,9 +50,8 @@ public class PathUtils {
* 获取项目所在磁盘的文件夹路径
* @return
*/
- public static String getProjectPath() {
+ public static String getProjectPath(HttpServletRequest request) {
try {
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// 获取地址内容,原路径(项目名)
String realPath = request.getSession().getServletContext().getRealPath("/");
// tomcat webapps下部署
@@ -72,11 +69,10 @@ public class PathUtils {
/**
* 获取服务路径
+ * @param request
* @return
*/
- public static String getServerPath() {
- HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-
+ public static String getServerPath(HttpServletRequest request) {
String domain = request.getScheme() + "://" + request.getServerName();
int port = request.getServerPort();
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java
index 58df3ab..2cdd60c 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/string/ZHUtils.java
@@ -16,7 +16,7 @@ public class ZHUtils {
* @param text
* @return
*/
- public static String toTraditionalChar(String text) {
+ public static String toTC(String text) {
ZHConverter converter = ZHConverter.getInstance(ZHConverter.TC);
return converter.convert(text);
}
@@ -26,7 +26,7 @@ public class ZHUtils {
* @param text
* @return
*/
- public static String toSimpleChar(String text) {
+ public static String toSC(String text) {
ZHConverter converter = ZHConverter.getInstance(ZHConverter.SC);
return converter.convert(text);
}
--
Gitee
From 59253340aa771009eb843fdea93b05ab3a391a8c Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Mon, 2 Jan 2023 21:19:21 +0800
Subject: [PATCH 33/44] 20130102
---
.../cn/javaex/htool/core/io/FileUtils.java | 49 +--
.../java/cn/javaex/htool/core/io/IOUtils.java | 289 ------------------
.../htool/core/io/handler/PathHandler.java | 23 +-
.../core/io/output/StringBuilderWriter.java | 138 ---------
4 files changed, 31 insertions(+), 468 deletions(-)
delete mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
index aa6d6e7..4c41148 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
@@ -2,6 +2,7 @@ package cn.javaex.htool.core.io;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -9,6 +10,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
+import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
@@ -37,7 +39,7 @@ import cn.javaex.htool.core.string.StringUtils;
*/
public class FileUtils extends FileHelper {
/** 默认缓冲区大小 */
- private static final int BUFFER_SIZE = 2048;
+ private static final int BUFFER_SIZE = 1024;
/**
* 递归删除文件或目录(目录本身也删除)
@@ -185,7 +187,6 @@ public class FileUtils extends FileHelper {
TreeFile treeFile = new TreeFile();
treeFile.setFile(file);
-
if (file.isDirectory()) {
// 递归,获取路径中子路径中的所有文件
List listDeepFilesAndDirectorys = listDeepFilesAndDirectorys(file);
@@ -440,8 +441,10 @@ public class FileUtils extends FileHelper {
*/
public static void write(File file, String data, String charsetName, boolean isAppend)
throws IOException {
- try (OutputStream out = IOUtils.openOutputStream(file, isAppend)) {
- IOUtils.write(data, out, Charsets.toCharset(charsetName));
+ try (OutputStream output = IOUtils.openOutputStream(file, isAppend)) {
+ if (data != null) {
+ output.write(data.getBytes(Charsets.toCharset(charsetName)));
+ }
}
}
@@ -491,7 +494,17 @@ public class FileUtils extends FileHelper {
return new String(bytes, Charsets.toCharset(charsetName));
} else {
try (InputStream inputStream = IOUtils.openInputStream(file)) {
- return IOUtils.toString(inputStream, Charsets.toCharset(charsetName));
+ ByteArrayOutputStream result = new ByteArrayOutputStream();
+ byte[] buffer = new byte[BUFFER_SIZE];
+ int length;
+
+ while ((length = inputStream.read(buffer)) != -1) {
+ result.write(buffer, 0, length);
+ }
+
+ charsetName = charsetName==null ? Charset.defaultCharset().name() : charsetName;
+
+ return result.toString(charsetName);
}
}
}
@@ -523,7 +536,7 @@ public class FileUtils extends FileHelper {
deleteFileOrDirectory(zipFile);
}
- byte[] buffer = new byte[1024*10];
+ byte[] buffer = new byte[BUFFER_SIZE * 10];
FileInputStream fis = null;
BufferedInputStream bis = null;
FileOutputStream fos = null;
@@ -540,9 +553,9 @@ public class FileUtils extends FileHelper {
zos.putNextEntry(zipEntry);
fis = new FileInputStream(srcFile);
- bis = new BufferedInputStream(fis, 1024*10);
+ bis = new BufferedInputStream(fis, BUFFER_SIZE * 10);
int read = 0;
- while ((read=bis.read(buffer, 0, 1024*10)) != -1) {
+ while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) {
zos.write(buffer, 0, read);
}
zos.flush();
@@ -569,9 +582,9 @@ public class FileUtils extends FileHelper {
zos.putNextEntry(zipEntry);
fis = new FileInputStream(file);
- bis = new BufferedInputStream(fis, 1024*10);
+ bis = new BufferedInputStream(fis, BUFFER_SIZE * 10);
int read = 0;
- while ((read=bis.read(buffer, 0, 1024*10)) != -1) {
+ while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) {
zos.write(buffer, 0, read);
}
@@ -601,7 +614,7 @@ public class FileUtils extends FileHelper {
File file = new File(zipPath);
FileHandler.requireFile(file);
- byte[] buffer = new byte[1024*10];
+ byte[] buffer = new byte[BUFFER_SIZE * 10];
ZipFile zipFile = null;
try {
@@ -624,11 +637,11 @@ public class FileUtils extends FileHelper {
targetFile.createNewFile();
// 将压缩文件内容写入到这个文件中
InputStream in = zipFile.getInputStream(entry);
- BufferedInputStream bis = new BufferedInputStream(in, 1024*10);
+ BufferedInputStream bis = new BufferedInputStream(in, BUFFER_SIZE * 10);
FileOutputStream fos = new FileOutputStream(targetFile);
int read;
- while ((read=bis.read(buffer, 0, 1024*10)) != -1) {
+ while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) {
fos.write(buffer, 0, read);
}
@@ -661,8 +674,8 @@ public class FileUtils extends FileHelper {
newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
}
- InputStream in = PathHandler.getInputStreamFromResource(filePath);
- downloadFile(response, in, newFileName);
+ InputStream inputStream = PathHandler.getInputStreamFromResource(filePath);
+ downloadFile(response, inputStream, newFileName);
}
/**
@@ -741,11 +754,9 @@ public class FileUtils extends FileHelper {
byte[] buff = new byte[BUFFER_SIZE];
while (true) {
int bytesRead;
-
if (-1 == (bytesRead=bis.read(buff, 0, buff.length))) {
break;
}
-
bos.write(buff, 0, bytesRead);
}
@@ -781,7 +792,7 @@ public class FileUtils extends FileHelper {
}
}
- final int index = FilenameHandler.indexOfExtension(fileName);
+ int index = FilenameHandler.indexOfExtension(fileName);
if (index == NOT_FOUND) {
return EMPTY_STRING;
}
@@ -822,7 +833,7 @@ public class FileUtils extends FileHelper {
return fileName;
}
- final int index = FilenameHandler.indexOfLastSeparator(fileName);
+ int index = FilenameHandler.indexOfLastSeparator(fileName);
return fileName.substring(index + 1);
}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java
index 904e3bc..8098616 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/IOUtils.java
@@ -5,16 +5,9 @@ import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
-import java.nio.charset.Charset;
import java.util.Objects;
import cn.javaex.htool.core.io.handler.FileHandler;
-import cn.javaex.htool.core.io.output.StringBuilderWriter;
/**
* IO流工具类
@@ -24,99 +17,6 @@ import cn.javaex.htool.core.io.output.StringBuilderWriter;
*/
public class IOUtils {
- /**
- * CR char.
- *
- * @since 2.9.0
- */
- public static final int CR = '\r';
-
- /**
- * The default buffer size ({@value}) to use in copy methods.
- */
- public static final int DEFAULT_BUFFER_SIZE = 8192;
-
- /**
- * The system directory separator character.
- */
- public static final char DIR_SEPARATOR = File.separatorChar;
-
- /**
- * The Unix directory separator character.
- */
- public static final char DIR_SEPARATOR_UNIX = '/';
-
- /**
- * The Windows directory separator character.
- */
- public static final char DIR_SEPARATOR_WINDOWS = '\\';
-
- /**
- * A singleton empty byte array.
- *
- * @since 2.9.0
- */
- public static final byte[] EMPTY_BYTE_ARRAY = {};
-
- /**
- * Represents the end-of-file (or stream).
- *
- * @since 2.5 (made public)
- */
- public static final int EOF = -1;
-
- /**
- * LF char.
- *
- * @since 2.9.0
- */
- public static final int LF = '\n';
-
- /**
- * Internal byte array buffer.
- */
- private static final ThreadLocal SKIP_BYTE_BUFFER = ThreadLocal.withInitial(IOUtils::byteArray);
-
- /**
- * Internal byte array buffer.
- */
- private static final ThreadLocal SKIP_CHAR_BUFFER = ThreadLocal.withInitial(IOUtils::charArray);
-
- /**
- * Returns a new byte array of size {@link #DEFAULT_BUFFER_SIZE}.
- *
- * @return a new byte array of size {@link #DEFAULT_BUFFER_SIZE}.
- * @since 2.9.0
- */
- public static byte[] byteArray() {
- return byteArray(DEFAULT_BUFFER_SIZE);
- }
-
- /**
- * Returns a new char array of size {@link #DEFAULT_BUFFER_SIZE}.
- *
- * @return a new char array of size {@link #DEFAULT_BUFFER_SIZE}.
- * @since 2.9.0
- */
- private static char[] charArray() {
- return charArray(DEFAULT_BUFFER_SIZE);
- }
-
- /**
- * Returns a new char array of the given size.
- *
- * TODO Consider guarding or warning against large allocations...
- *
- * @param size array size.
- * @return a new char array of the given size.
- * @since 2.9.0
- */
- private static char[] charArray(int size) {
- return new char[size];
- }
-
- // 关闭流
- // -----------------------------------------------------------------------
/**
* 关闭一个IO流、socket、或者selector且不抛出异常
*/
@@ -130,196 +30,8 @@ public class IOUtils {
}
}
- // copy
- // -----------------------------------------------------------------------
- /**
- * 将InputStream中的内容复制到Writer中
- *
- * @param input InputStream
- * @param writer Writer
- * @param charset 字符集
- * @throws IOException if an I/O error occurs
- */
- public static void copy(InputStream input, Writer writer, Charset charset)
- throws IOException {
- InputStreamReader reader = new InputStreamReader(input, charset);
- copy(reader, writer);
- }
-
- /**
- * 将Reader中的内容复制到Writer中
- *
- * 此方法在内部缓冲输入,因此不需要使用BufferedReader
- *
- * 大型流(超过2GB)将返回字符复制值
- *
- *
- * @param reader Reader
- * @param writer Writer
- * @return the number of characters copied, or -1 if > Integer.MAX_VALUE
- * @throws IOException if an I/O error occurs
- */
- public static int copy(Reader reader, Writer writer) throws IOException {
- long count = copyLarge(reader, writer);
- if (count > Integer.MAX_VALUE) {
- return -1;
- }
- return (int) count;
- }
-
- /**
- * Copies bytes from a large (over 2GB) {@code InputStream} to an
- * {@code OutputStream}.
- *
- * This method buffers the input internally, so there is no need to use a
- * {@code BufferedInputStream}.
- *
- *
- * The buffer size is given by {@link #DEFAULT_BUFFER_SIZE}.
- *
- *
- * @param inputStream the {@code InputStream} to read.
- * @param outputStream the {@code OutputStream} to write.
- * @return the number of bytes copied.
- * @throws NullPointerException if the InputStream is {@code null}.
- * @throws NullPointerException if the OutputStream is {@code null}.
- * @throws IOException if an I/O error occurs.
- * @since 1.3
- */
- public static long copyLarge(InputStream inputStream, OutputStream outputStream) throws IOException {
- return copy(inputStream, outputStream, DEFAULT_BUFFER_SIZE);
- }
-
- /**
- * Copies chars from a large (over 2GB) {@code Reader} to a {@code Writer}.
- *
- * This method buffers the input internally, so there is no need to use a
- * {@code BufferedReader}.
- *
- * The buffer size is given by {@link #DEFAULT_BUFFER_SIZE}.
- *
- * @param reader the {@code Reader} to source.
- * @param writer the {@code Writer} to target.
- * @return the number of characters copied
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @since 1.3
- */
- public static long copyLarge(Reader reader, Writer writer) throws IOException {
- return copyLarge(reader, writer, getCharArray());
- }
-
- /**
- * Copies chars from a large (over 2GB) {@code Reader} to a {@code Writer}.
- *
- * This method uses the provided buffer, so there is no need to use a
- * {@code BufferedReader}.
- *
- *
- * @param reader the {@code Reader} to source.
- * @param writer the {@code Writer} to target.
- * @param buffer the buffer to be used for the copy
- * @return the number of characters copied
- * @throws NullPointerException if the input or output is null
- * @throws IOException if an I/O error occurs
- * @since 2.2
- */
- public static long copyLarge(Reader reader, Writer writer, char[] buffer) throws IOException {
- long count = 0;
- int n;
- while (-1 != (n = reader.read(buffer))) {
- writer.write(buffer, 0, n);
- count += n;
- }
- return count;
- }
-
- public static long copy(InputStream inputStream, OutputStream outputStream, int bufferSize)
- throws IOException {
- return copyLarge(inputStream, outputStream, IOUtils.byteArray(bufferSize));
- }
-
- /**
- * 将InputStream(字节超过2GB)中的内容复制到OutputStream中
- *
- *
- * @param inputStream InputStream
- * @param outputStream OutputStream
- * @param 缓冲区用于复制的缓冲区
- * @return the number of bytes copied.
- *
- * @throws IOException if an I/O error occurs.
- */
- public static long copyLarge(InputStream inputStream, OutputStream outputStream, byte[] buffer)
- throws IOException {
- Objects.requireNonNull(inputStream, "inputStream cannot be empty");
- Objects.requireNonNull(outputStream, "outputStream cannot be empty");
- long count = 0;
- int n;
- while (EOF != (n = inputStream.read(buffer))) {
- outputStream.write(buffer, 0, n);
- count += n;
- }
- return count;
- }
-
- // toString
- // -----------------------------------------------------------------------
- public static String toString(InputStream input) throws IOException {
- return toString(input, Charset.defaultCharset());
- }
-
- public static String toString(InputStream input, Charset charset) throws IOException {
- try (StringBuilderWriter sw = new StringBuilderWriter()) {
- copy(input, sw, charset);
- return sw.toString();
- }
- }
-
- /**
- * Gets the thread local char array.
- *
- * @return the thread local char array.
- */
- static char[] getCharArray() {
- return SKIP_CHAR_BUFFER.get();
- }
-
- /**
- * Returns a new byte array of the given size.
- *
- * TODO Consider guarding or warning against large allocations...
- *
- * @param size array size.
- * @return a new byte array of the given size.
- * @since 2.9.0
- */
- public static byte[] byteArray(int size) {
- return new byte[size];
- }
-
- /**
- * Writes chars from a {@code String} to bytes on an {@code OutputStream} using
- * the specified character encoding.
- *
- * This method uses {@link String#getBytes(String)}.
- *
- * @param data the {@code String} to write, null ignored
- * @param output the {@code OutputStream} to write to
- * @param charset the charset to use, null means platform default
- * @throws NullPointerException if output is null
- * @throws IOException if an I/O error occurs
- * @since 2.3
- */
- public static void write(String data, OutputStream output, Charset charset) throws IOException {
- if (data != null) {
- output.write(data.getBytes(Charsets.toCharset(charset)));
- }
- }
-
/**
* 打开指定文件的FileOutputStream,并检查如果父级目录不存在,则创建父级目录
- *
* @param file
* @param append
* @return
@@ -338,7 +50,6 @@ public class IOUtils {
/**
* 打开指定文件的FileInputStream
- *
* @param file
* @return
* @throws IOException
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java
index 5a4f69c..bc9cc35 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java
@@ -12,16 +12,7 @@ import javax.servlet.http.HttpServletRequest;
* @Date 2022年12月1日
*/
public class PathHandler {
-
- /**
- * 路径转换
- * @param str
- * @return
- */
- public static String slashify(String str) {
- return str.replace('\\', '/');
- }
-
+
/**
* 判断是否是绝对路径
* @param path
@@ -67,18 +58,6 @@ public class PathHandler {
}
}
- /**
- * 获取服务路径
- * @param request
- * @return
- */
- public static String getServerPath(HttpServletRequest request) {
- String domain = request.getScheme() + "://" + request.getServerName();
- int port = request.getServerPort();
-
- return port==80 ? domain : domain + ":" + port;
- }
-
/**
* 根据resources下的文件路径获取流
* @param path 例如:template/excel/模板.xlsx
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java b/htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java
deleted file mode 100644
index be10f6b..0000000
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/output/StringBuilderWriter.java
+++ /dev/null
@@ -1,138 +0,0 @@
-package cn.javaex.htool.core.io.output;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.io.Writer;
-
-public class StringBuilderWriter extends Writer implements Serializable {
- private static final long serialVersionUID = 1L;
- private final StringBuilder builder;
-
- /**
- * Constructs a new {@link StringBuilder} instance with default capacity.
- */
- public StringBuilderWriter() {
- this.builder = new StringBuilder();
- }
-
- /**
- * Constructs a new {@link StringBuilder} instance with the specified capacity.
- *
- * @param capacity The initial capacity of the underlying {@link StringBuilder}
- */
- public StringBuilderWriter(final int capacity) {
- this.builder = new StringBuilder(capacity);
- }
-
- /**
- * Constructs a new instance with the specified {@link StringBuilder}.
- *
- *
If {@code builder} is null a new instance with default capacity will be created.
- *
- * @param builder The String builder. May be null.
- */
- public StringBuilderWriter(final StringBuilder builder) {
- this.builder = builder != null ? builder : new StringBuilder();
- }
-
- /**
- * Appends a single character to this Writer.
- *
- * @param value The character to append
- * @return This writer instance
- */
- @Override
- public Writer append(final char value) {
- builder.append(value);
- return this;
- }
-
- /**
- * Appends a character sequence to this Writer.
- *
- * @param value The character to append
- * @return This writer instance
- */
- @Override
- public Writer append(final CharSequence value) {
- builder.append(value);
- return this;
- }
-
- /**
- * Appends a portion of a character sequence to the {@link StringBuilder}.
- *
- * @param value The character to append
- * @param start The index of the first character
- * @param end The index of the last character + 1
- * @return This writer instance
- */
- @Override
- public Writer append(final CharSequence value, final int start, final int end) {
- builder.append(value, start, end);
- return this;
- }
-
- /**
- * Closing this writer has no effect.
- */
- @Override
- public void close() {
- // no-op
- }
-
- /**
- * Flushing this writer has no effect.
- */
- @Override
- public void flush() {
- // no-op
- }
-
-
- /**
- * Writes a String to the {@link StringBuilder}.
- *
- * @param value The value to write
- */
- @Override
- public void write(final String value) {
- if (value != null) {
- builder.append(value);
- }
- }
-
- /**
- * Writes a portion of a character array to the {@link StringBuilder}.
- *
- * @param value The value to write
- * @param offset The index of the first character
- * @param length The number of characters to write
- */
- @Override
- public void write(final char[] value, final int offset, final int length) {
- if (value != null) {
- builder.append(value, offset, length);
- }
- }
-
- /**
- * Returns the underlying builder.
- *
- * @return The underlying builder
- */
- public StringBuilder getBuilder() {
- return builder;
- }
-
- /**
- * Returns {@link StringBuilder#toString()}.
- *
- * @return The contents of the String builder.
- */
- @Override
- public String toString() {
- return builder.toString();
- }
-
-}
--
Gitee
From e3205e8b5c833035c4af1394ad139797b798c1e0 Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Mon, 2 Jan 2023 22:30:58 +0800
Subject: [PATCH 34/44] 20130102
---
htool-all/pom.xml | 5 --
.../cn/javaex/htool/core}/date/DateUtils.java | 8 +--
.../htool/core}/date/TimeConversion.java | 10 +--
.../core}/date/constant/DatePattern.java | 2 +-
.../htool/core}/date/enums/TimeUnit.java | 2 +-
.../htool/core}/date/handler/DateHandler.java | 6 +-
.../core}/date/handler/LocalDateHandler.java | 4 +-
.../date/handler/LocalDateTimeHandler.java | 4 +-
.../htool/core}/date/handler/TimeHandler.java | 14 ++--
.../cn/javaex/htool/core/io/PropUtils.java | 71 +++++++++++++++++++
htool-date/pom.xml | 11 ---
pom.xml | 1 -
12 files changed, 98 insertions(+), 40 deletions(-)
rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/DateUtils.java (98%)
rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/TimeConversion.java (93%)
rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/constant/DatePattern.java (96%)
rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/enums/TimeUnit.java (95%)
rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/handler/DateHandler.java (96%)
rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/handler/LocalDateHandler.java (95%)
rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/handler/LocalDateTimeHandler.java (95%)
rename {htool-date/src/main/java/cn/javaex/htool => htool-core/src/main/java/cn/javaex/htool/core}/date/handler/TimeHandler.java (95%)
create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/PropUtils.java
delete mode 100644 htool-date/pom.xml
diff --git a/htool-all/pom.xml b/htool-all/pom.xml
index de8900e..ffaaf86 100644
--- a/htool-all/pom.xml
+++ b/htool-all/pom.xml
@@ -25,11 +25,6 @@
htool-crypto
${project.parent.version}
-
- cn.javaex
- htool-date
- ${project.parent.version}
-
cn.javaex
htool-http
diff --git a/htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java
similarity index 98%
rename from htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java
rename to htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java
index 6a05020..d000099 100644
--- a/htool-date/src/main/java/cn/javaex/htool/date/DateUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java
@@ -1,4 +1,4 @@
-package cn.javaex.htool.date;
+package cn.javaex.htool.core.date;
import java.text.ParseException;
import java.time.LocalDate;
@@ -8,9 +8,9 @@ import java.time.Year;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
-import cn.javaex.htool.date.constant.DatePattern;
-import cn.javaex.htool.date.enums.TimeUnit;
-import cn.javaex.htool.date.handler.TimeHandler;
+import cn.javaex.htool.core.date.constant.DatePattern;
+import cn.javaex.htool.core.date.enums.TimeUnit;
+import cn.javaex.htool.core.date.handler.TimeHandler;
/**
* 日期时间工具类
diff --git a/htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java b/htool-core/src/main/java/cn/javaex/htool/core/date/TimeConversion.java
similarity index 93%
rename from htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java
rename to htool-core/src/main/java/cn/javaex/htool/core/date/TimeConversion.java
index e901b90..99fb486 100644
--- a/htool-date/src/main/java/cn/javaex/htool/date/TimeConversion.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/date/TimeConversion.java
@@ -1,14 +1,14 @@
-package cn.javaex.htool.date;
+package cn.javaex.htool.core.date;
import java.text.ParseException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
-import cn.javaex.htool.date.handler.DateHandler;
-import cn.javaex.htool.date.handler.LocalDateHandler;
-import cn.javaex.htool.date.handler.LocalDateTimeHandler;
-import cn.javaex.htool.date.handler.TimeHandler;
+import cn.javaex.htool.core.date.handler.DateHandler;
+import cn.javaex.htool.core.date.handler.LocalDateHandler;
+import cn.javaex.htool.core.date.handler.LocalDateTimeHandler;
+import cn.javaex.htool.core.date.handler.TimeHandler;
/**
* 日期时间转换
diff --git a/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java b/htool-core/src/main/java/cn/javaex/htool/core/date/constant/DatePattern.java
similarity index 96%
rename from htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java
rename to htool-core/src/main/java/cn/javaex/htool/core/date/constant/DatePattern.java
index 2e32080..48a61b2 100644
--- a/htool-date/src/main/java/cn/javaex/htool/date/constant/DatePattern.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/date/constant/DatePattern.java
@@ -1,4 +1,4 @@
-package cn.javaex.htool.date.constant;
+package cn.javaex.htool.core.date.constant;
/**
* 日期格式化常量
diff --git a/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java b/htool-core/src/main/java/cn/javaex/htool/core/date/enums/TimeUnit.java
similarity index 95%
rename from htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java
rename to htool-core/src/main/java/cn/javaex/htool/core/date/enums/TimeUnit.java
index 2b80c89..743c151 100644
--- a/htool-date/src/main/java/cn/javaex/htool/date/enums/TimeUnit.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/date/enums/TimeUnit.java
@@ -1,4 +1,4 @@
-package cn.javaex.htool.date.enums;
+package cn.javaex.htool.core.date.enums;
import java.util.Arrays;
diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/DateHandler.java
similarity index 96%
rename from htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java
rename to htool-core/src/main/java/cn/javaex/htool/core/date/handler/DateHandler.java
index 9fa19c9..b1ea3fe 100644
--- a/htool-date/src/main/java/cn/javaex/htool/date/handler/DateHandler.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/DateHandler.java
@@ -1,6 +1,4 @@
-package cn.javaex.htool.date.handler;
-
-import cn.javaex.htool.date.constant.DatePattern;
+package cn.javaex.htool.core.date.handler;
import java.lang.reflect.Field;
import java.text.ParseException;
@@ -13,6 +11,8 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
+import cn.javaex.htool.core.date.constant.DatePattern;
+
/**
* java.util.Date处理器
*
diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateHandler.java
similarity index 95%
rename from htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java
rename to htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateHandler.java
index 869cb79..4d1ae8d 100644
--- a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateHandler.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateHandler.java
@@ -1,4 +1,4 @@
-package cn.javaex.htool.date.handler;
+package cn.javaex.htool.core.date.handler;
import java.lang.reflect.Field;
import java.time.Instant;
@@ -11,7 +11,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
-import cn.javaex.htool.date.constant.DatePattern;
+import cn.javaex.htool.core.date.constant.DatePattern;
/**
* java.time.LocalDate处理器
diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateTimeHandler.java
similarity index 95%
rename from htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java
rename to htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateTimeHandler.java
index 7c4b161..2223114 100644
--- a/htool-date/src/main/java/cn/javaex/htool/date/handler/LocalDateTimeHandler.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/LocalDateTimeHandler.java
@@ -1,4 +1,4 @@
-package cn.javaex.htool.date.handler;
+package cn.javaex.htool.core.date.handler;
import java.lang.reflect.Field;
import java.time.Instant;
@@ -10,7 +10,7 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
-import cn.javaex.htool.date.constant.DatePattern;
+import cn.javaex.htool.core.date.constant.DatePattern;
/**
* java.time.LocalDateTime处理器
diff --git a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/TimeHandler.java
similarity index 95%
rename from htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java
rename to htool-core/src/main/java/cn/javaex/htool/core/date/handler/TimeHandler.java
index b083478..d9ee53e 100644
--- a/htool-date/src/main/java/cn/javaex/htool/date/handler/TimeHandler.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/date/handler/TimeHandler.java
@@ -1,16 +1,20 @@
-package cn.javaex.htool.date.handler;
-
-import cn.javaex.htool.date.DateUtils;
-import cn.javaex.htool.date.constant.DatePattern;
+package cn.javaex.htool.core.date.handler;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
-import java.time.*;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.Period;
+import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.function.Function;
+import cn.javaex.htool.core.date.DateUtils;
+import cn.javaex.htool.core.date.constant.DatePattern;
+
/**
* 时间处理器
*
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/PropUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/PropUtils.java
new file mode 100644
index 0000000..6add4ef
--- /dev/null
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/PropUtils.java
@@ -0,0 +1,71 @@
+package cn.javaex.htool.core.io;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.Properties;
+
+/**
+ * 读取properties的配置信息
+ *
+ * @author 陈霓清
+ * @Date 2023年1月2日
+ */
+public class PropUtils {
+
+ /**
+ * 从配置文件中获取配置参数
+ * @param path
+ * @param filename
+ * @param key
+ * @return
+ */
+ public static String getValue(String path, String filename, String key) {
+ String propertieValue = "";
+ InputStream in = null;
+
+ try {
+ in = new BufferedInputStream(new FileInputStream(path + File.separator + filename));
+ Properties prop = new Properties();
+ prop.load(in);
+ propertieValue = prop.getProperty(key,"");
+ in.close();
+ prop.clear();
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+
+ return propertieValue;
+ }
+
+ /**
+ * 从配置文件中获取配置参数
+ * @param filename
+ * @param key
+ * @return
+ */
+ public static String getValue(String filename, String key) {
+ String propertieValue = "";
+ InputStream in = null;
+
+ try {
+ in = new BufferedInputStream (new FileInputStream(PropUtils.class.getClassLoader().getResource(filename).getFile()));
+
+ Properties prop = new Properties();
+ prop.load(in);
+ propertieValue = prop.getProperty(key);
+ in.close();
+ prop.clear();
+ } catch (Exception e) {
+ e.printStackTrace();
+ } finally {
+ IOUtils.closeQuietly(in);
+ }
+
+ return propertieValue;
+ }
+
+}
diff --git a/htool-date/pom.xml b/htool-date/pom.xml
deleted file mode 100644
index 4073200..0000000
--- a/htool-date/pom.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
- 4.0.0
-
- cn.javaex
- htool
- 1.0.0
-
- htool-date
- htool-date
- 日期时间处理
-
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index ec58daf..1f304b5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,6 @@
htool-cache
htool-core
htool-crypto
- htool-date
htool-http
htool-picture
--
Gitee
From 52e631332cadd1b37ac05c6539b680c1c8efea9e Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Tue, 3 Jan 2023 14:23:37 +0800
Subject: [PATCH 35/44] =?UTF-8?q?=E6=AD=A3=E5=88=99=E8=A1=A8=E8=BE=BE?=
=?UTF-8?q?=E5=BC=8F=E5=92=8C=E8=BA=AB=E4=BB=BD=E8=AF=81=E4=BF=A1=E6=81=AF?=
=?UTF-8?q?=E8=8E=B7=E5=8F=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cn/javaex/htool/core/date/DateUtils.java | 8 +-
.../javaex/htool/core/regular/CheckUtils.java | 421 +++++++++++++
.../javaex/htool/core/string/IDCardUtils.java | 577 ++++++++++++++++++
.../cn/javaex/htool/regular/RegularUtil.java | 106 ----
.../java/cn/javaex/htool/http/HttpUtils.java | 316 +++++++++-
5 files changed, 1313 insertions(+), 115 deletions(-)
create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java
create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/string/IDCardUtils.java
delete mode 100644 htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java
index d000099..52eb176 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/date/DateUtils.java
@@ -490,11 +490,11 @@ public class DateUtils extends TimeConversion {
* @return
* @throws ParseException
*/
- public static long age(String time, String pattern) throws ParseException {
+ public static int age(String time, String pattern) throws ParseException {
LocalDate time1 = DateUtils.parseLocalDate(time, pattern);
LocalDate time2 = LocalDate.now();
- return DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue());
+ return (int) DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue());
}
/**
@@ -504,13 +504,13 @@ public class DateUtils extends TimeConversion {
* @return
* @throws ParseException
*/
- public static long age(T time) throws ParseException {
+ public static int age(T time) throws ParseException {
String timestr1 = new TimeHandler().format(time, DatePattern.yyyyMMdd);
LocalDate time1 = parseLocalDate(timestr1, DatePattern.yyyyMMdd);
LocalDate time2 = LocalDate.now();
- return DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue());
+ return (int) DateUtils.timeDifference(time1, time2, TimeUnit.YEAR.getValue());
}
/**
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java
new file mode 100644
index 0000000..f307767
--- /dev/null
+++ b/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java
@@ -0,0 +1,421 @@
+package cn.javaex.htool.core.regular;
+
+import java.util.regex.Pattern;
+
+import cn.javaex.htool.core.string.IDCardUtils;
+
+/**
+ * 文字校验工具类
+ *
+ * @author 陈霓清
+ * @Date 2023年1月2日
+ */
+public class CheckUtils {
+
+ /**
+ * 给定内容是否匹配正则
+ * @param pattern 模式
+ * @param content 内容
+ * @return 正则为null或者""时不检查,返回true,内容为null返回false
+ */
+ public static boolean isMatch(Pattern pattern, CharSequence content) {
+ if (content==null || pattern==null) {
+ return false;
+ }
+ return pattern.matcher(content).matches();
+ }
+
+ /**
+ * 验证是否为(中国大陆)手机号码
+ * 中国大陆: +86 133 9511 1345,2位区域码标示+11位数字
+ * @param value
+ * @return
+ */
+ public static boolean isMobile(String value) {
+ String regex = "(?:0|86|\\+86)?1[3-9]\\d{9}";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为(中国香港)手机号码
+ * 中国香港: +852 5100 4870, 三位区域码+10位数字, 中国香港手机号码8位数
+ * @param value
+ * @return
+ */
+ public static boolean isMobileHK(String value) {
+ String regex = "(?:0|852|\\+852)?\\d{8}";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为(中国台湾)手机号码
+ * 中国台湾: +886 09 60 000000, 三位区域码+号码以数字09开头 + 8位数字, 中国台湾手机号码10位数
+ * @param value
+ * @return
+ */
+ public static boolean isMobileTW(String value) {
+ String regex = "(?:0|886|\\+886)?(?:|-)09\\d{8}";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为(中国澳门)手机号码
+ * 中国澳门: +853 68 00000, 三位区域码 +号码以数字6开头 + 7位数字, 中国澳门手机号码8位数
+ * @param value
+ * @return
+ */
+ public static boolean isMobileMO(String value) {
+ String regex = "(?:0|853|\\+853)?(?:|-)6\\d{7}";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为座机号码(中国)
+ * @param value
+ * @return
+ */
+ public static boolean isTel(String value) {
+ String regex = "(010|02\\d|0[3-9]\\d{2})-?(\\d{6,8})";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为座机服务号码(中国+400 +800)
+ * @param value
+ * @return
+ */
+ public static boolean isTel400800(String value) {
+ String regex = "0\\d{2,3}[\\- ]?[1-9]\\d{6,7}|[48]00[\\- ]?[1-9]\\d{6}";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为邮箱
+ * @param value
+ * @return
+ */
+ public static boolean isEmail(String value) {
+ String regex = "(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)])";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为邮政编码
+ * @param value
+ * @return
+ */
+ public static boolean isPostCode(String value) {
+ String regex = "^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[0-7]|6[0-7]|7[0-5]|8[0-9]|9[0-8])\\d{4}|99907[78]$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为IPV4地址
+ * @param value
+ * @return
+ */
+ public static boolean isIpv4(String value) {
+ String regex = "^(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为IPV6地址
+ * @param value
+ * @return
+ */
+ public static boolean isIpv6(String value) {
+ String regex = "(([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]+|::(ffff(:0{1,4})?:)?((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1?[0-9])?[0-9])\\.){3}(25[0-5]|(2[0-4]|1?[0-9])?[0-9]))";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为MAC地址
+ * @param value
+ * @return
+ */
+ public static boolean isMac(String value) {
+ String regex = "((?:[a-fA-F0-9]{1,2}[:-]){5}[a-fA-F0-9]{1,2})|0x(\\d{12}).+ETHER";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为中国车牌号(兼容新能源车牌)
+ * @param value
+ * @return
+ */
+ public static boolean isCarNumber(String value) {
+ String regex = "^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[ABCDEFGHJK])|([ABCDEFGHJK]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领]\\d{3}\\d{1,3}[领])|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为车架号
+ * 行驶证编号 车辆识别代号 车辆识别码
+ * @param value
+ * @return
+ */
+ public static boolean isCarVin(String value) {
+ String regex = "^[A-HJ-NPR-Z0-9]{8}[0-9X][A-HJ-NPR-Z0-9]{2}\\d{6}$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为驾驶证 别名:驾驶证档案编号、行驶证编号
+ * @param value
+ * @return
+ */
+ public static boolean isCarDrivingLicence(String value) {
+ String regex = "^[0-9]{12}$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为身份证号码(支持18位、15位和港澳台的10位)
+ * @param value
+ * @return
+ */
+ public static boolean isIDCard(String value) {
+ return IDCardUtils.isIDCard(value);
+ }
+
+ /**
+ * 验证是否为统一社会信用代码
+ * @param value
+ * @return
+ */
+ public static boolean isCreditCode(String value) {
+ String regex = "^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为纯汉字
+ * @param value
+ * @return
+ */
+ public static boolean isChinese(String value) {
+ /**
+ * 单个中文汉字
+ * 参照维基百科汉字Unicode范围(https://zh.wikipedia.org/wiki/%E6%B1%89%E5%AD%97 页面右侧)
+ */
+ String chinese = "[\u2E80-\u2EFF\u2F00-\u2FDF\u31C0-\u31EF\u3400-\u4DBF\u4E00-\u9FFF\uF900-\uFAFF\uD840\uDC00-\uD869\uDEDF\uD869\uDF00-\uD86D\uDF3F\uD86D\uDF40-\uD86E\uDC1F\uD86E\uDC20-\uD873\uDEAF\uD87E\uDC00-\uD87E\uDE1F]";
+ /**
+ * 中文汉字
+ */
+ String chineses = chinese + "+";
+
+ Pattern pattern = Pattern.compile(chineses);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为纯字母
+ * @param value
+ * @return
+ */
+ public static boolean isWord(String value) {
+ String regex = "[a-zA-Z]+";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为Hex(16进制)字符串
+ * @param value
+ * @return
+ */
+ public static boolean isHex(String value) {
+ String regex = "^[a-fA-F0-9]+$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为纯数字
+ * @param value
+ * @return
+ */
+ public static boolean isNumber(String value) {
+ if (value != null && value.trim().length() > 0) {
+ value = value.trim();
+ value = (value.charAt(0) == '-' ? value.substring(1) : value);
+ String regex = "^\\d+$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ return false;
+ }
+
+ /**
+ * 验证是否为价格
+ * @param value
+ * @return
+ */
+ public static boolean isMoney(String value) {
+ String regex = "^(\\d+(?:\\.\\d+)?)$";
+ Pattern pattern = Pattern.compile(regex);
+ if (!isMatch(pattern, value)) {
+ return false;
+ }
+
+ // 判断2位小数位
+ if (value.indexOf(".") > 0) {
+ String decimal = value.split("\\.")[1];
+ if (decimal.length() > 2) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * 验证是否为整数
+ * @param value
+ * @return
+ */
+ public static boolean isInt(String value) {
+ String regex = "^-?\\d+$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为正整数
+ * @param value
+ * @return
+ */
+ public static boolean isPositiveInt(String value) {
+ String regex = "^[0-9]*[1-9][0-9]*$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为负整数
+ * @param value
+ * @return
+ */
+ public static boolean isNegativeInt(String value) {
+ String regex = "^-[0-9]*[1-9][0-9]*$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为非负整数:正整数 + 0
+ * @param value
+ * @return
+ */
+ public static boolean isNonnegativeInt(String value) {
+ String regex = "^\\d+$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为非正整数:负整数 + 0
+ * @param value
+ * @return
+ */
+ public static boolean isNonpositiveInt(String value) {
+ String regex = "^((-\\d+)|(0+))$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为正数
+ * @param value
+ * @return
+ */
+ public static boolean isPositiveDecimal(String value) {
+ String regex = "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为负数
+ * @param value
+ * @return
+ */
+ public static boolean isNegativeDecimal(String value) {
+ String regex = "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为非负数:0 + 正整数 + 正小数
+ * @param value
+ * @return
+ */
+ public static boolean isNonnegativeDecimal(String value) {
+ String regex = "^\\d+(\\.\\d+)?$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为非正数:0 + 负整数 + 负小数
+ * @param value
+ * @return
+ */
+ public static boolean isNonpositiveDecimal(String value) {
+ String regex = "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为账号:只能输入5-10个以字母开头,可带数字、下划线的字符串
+ * @param value
+ * @return
+ */
+ public static boolean isAccount(String value) {
+ String regex = "^[a-zA-Z]{1}([a-zA-Z0-9_]){5,10}$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为昵称:长度限制为2-10个字,只允许中文、字母、数字和下划线
+ * @param value
+ * @return
+ */
+ public static boolean isNickname(String value) {
+ String regex = "^[a-zA-Z0-9_\u4e00-\u9fa5]{2,10}$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+ /**
+ * 验证是否为密码:6到16位,允许有字母、数字和一些特殊字符
+ * @param value
+ * @return
+ */
+ public static boolean isPassword(String value) {
+ String regex = "^[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]{6,16}$";
+ Pattern pattern = Pattern.compile(regex);
+ return isMatch(pattern, value);
+ }
+
+}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/IDCardUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/IDCardUtils.java
new file mode 100644
index 0000000..bc241a8
--- /dev/null
+++ b/htool-core/src/main/java/cn/javaex/htool/core/string/IDCardUtils.java
@@ -0,0 +1,577 @@
+package cn.javaex.htool.core.string;
+
+import java.text.ParseException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+
+import cn.javaex.htool.core.date.DateUtils;
+import cn.javaex.htool.core.date.constant.DatePattern;
+import cn.javaex.htool.core.regular.CheckUtils;
+
+/**
+ * 身份证号工具类
+ *
+ * @author 陈霓清
+ * @Date 2023年1月2日
+ */
+public class IDCardUtils {
+
+ /**
+ * 省市代码表
+ */
+ private static final Map PROVINCE_CODES = new HashMap<>();
+
+ /**
+ * 台湾身份首字母对应数字
+ */
+ private static final Map TW_FIRST_CODE = new HashMap<>();
+
+ /**
+ * 每位加权因子
+ */
+ private static final int[] POWER = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
+
+ static {
+ PROVINCE_CODES.put("11", "北京市");
+ PROVINCE_CODES.put("12", "天津市");
+ PROVINCE_CODES.put("13", "河北省");
+ PROVINCE_CODES.put("14", "山西省");
+ PROVINCE_CODES.put("15", "内蒙古自治区");
+ PROVINCE_CODES.put("21", "辽宁省");
+ PROVINCE_CODES.put("22", "吉林省");
+ PROVINCE_CODES.put("23", "黑龙江省");
+ PROVINCE_CODES.put("31", "上海市");
+ PROVINCE_CODES.put("32", "江苏省");
+ PROVINCE_CODES.put("33", "浙江省");
+ PROVINCE_CODES.put("34", "安徽省");
+ PROVINCE_CODES.put("35", "福建省");
+ PROVINCE_CODES.put("36", "江西省");
+ PROVINCE_CODES.put("37", "山东省");
+ PROVINCE_CODES.put("41", "河南省");
+ PROVINCE_CODES.put("42", "湖北省");
+ PROVINCE_CODES.put("43", "湖南省");
+ PROVINCE_CODES.put("44", "广东省");
+ PROVINCE_CODES.put("45", "广西壮族自治区");
+ PROVINCE_CODES.put("46", "海南省");
+ PROVINCE_CODES.put("50", "重庆市");
+ PROVINCE_CODES.put("51", "四川省");
+ PROVINCE_CODES.put("52", "贵州省");
+ PROVINCE_CODES.put("53", "云南省");
+ PROVINCE_CODES.put("54", "西藏自治区");
+ PROVINCE_CODES.put("61", "陕西省");
+ PROVINCE_CODES.put("62", "甘肃省");
+ PROVINCE_CODES.put("63", "青海省");
+ PROVINCE_CODES.put("64", "宁夏回族自治区");
+ PROVINCE_CODES.put("65", "新疆维吾尔自治区");
+ PROVINCE_CODES.put("71", "台湾省");
+ PROVINCE_CODES.put("81", "香港");
+ PROVINCE_CODES.put("82", "澳门");
+ PROVINCE_CODES.put("83", "台湾");
+ PROVINCE_CODES.put("91", "国外");
+
+ TW_FIRST_CODE.put('A', 10);
+ TW_FIRST_CODE.put('B', 11);
+ TW_FIRST_CODE.put('C', 12);
+ TW_FIRST_CODE.put('D', 13);
+ TW_FIRST_CODE.put('E', 14);
+ TW_FIRST_CODE.put('F', 15);
+ TW_FIRST_CODE.put('G', 16);
+ TW_FIRST_CODE.put('H', 17);
+ TW_FIRST_CODE.put('J', 18);
+ TW_FIRST_CODE.put('K', 19);
+ TW_FIRST_CODE.put('L', 20);
+ TW_FIRST_CODE.put('M', 21);
+ TW_FIRST_CODE.put('N', 22);
+ TW_FIRST_CODE.put('P', 23);
+ TW_FIRST_CODE.put('Q', 24);
+ TW_FIRST_CODE.put('R', 25);
+ TW_FIRST_CODE.put('S', 26);
+ TW_FIRST_CODE.put('T', 27);
+ TW_FIRST_CODE.put('U', 28);
+ TW_FIRST_CODE.put('V', 29);
+ TW_FIRST_CODE.put('X', 30);
+ TW_FIRST_CODE.put('Y', 31);
+ TW_FIRST_CODE.put('W', 32);
+ TW_FIRST_CODE.put('Z', 33);
+ TW_FIRST_CODE.put('I', 34);
+ TW_FIRST_CODE.put('O', 35);
+ }
+
+ /**
+ * 验证是否为身份证号码(支持18位、15位和港澳台的10位)
+ * @param value
+ * @return
+ */
+ public static boolean isIDCard(String idCard) {
+ if (StringUtils.isBlank(idCard)) {
+ return false;
+ }
+
+ int length = idCard.length();
+ switch (length) {
+ case 18: // 18位身份证
+ return isIDCard18(idCard);
+ case 15: // 15位身份证
+ return isIDCard15(idCard);
+ case 10: { // 10位身份证,港澳台地区
+ String[] cardVal = isIDCard10(idCard);
+ return null != cardVal && "true".equals(cardVal[2]);
+ }
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * 根据身份证号获取生日,只支持15或18位身份证号码
+ * @param idCard 身份证号
+ * @return 生日(yyyy-MM-dd)
+ */
+ public static String getBirthday(String idCard) {
+ if (!isIDCard(idCard)) {
+ return "";
+ }
+
+ String birthday = "";
+ int len = idCard.length();
+ if (len == 18) {
+ birthday = idCard.substring(6, 14);
+ } else {
+ birthday = "19" + idCard.substring(6, 12);
+ }
+
+ return birthday.substring(0, 4) + "-" + birthday.substring(4, 6) + "-" + birthday.substring(6, 8);
+ }
+
+ /**
+ * 根据身份证号获取年龄
+ * 只支持15或18位身份证号码
+ * @param idCard 身份证号
+ * @return
+ */
+ public static int getAge(String idCard) {
+ if (!isIDCard(idCard)) {
+ return 0;
+ }
+
+ String birthday = "";
+ int len = idCard.length();
+ if (len == 18) {
+ birthday = idCard.substring(6, 14);
+ } else {
+ birthday = "19" + idCard.substring(6, 12);
+ }
+
+ try {
+ return DateUtils.age(birthday, DatePattern.yyyyMMdd.replace("-", ""));
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+
+ return 0;
+ }
+
+ /**
+ * 根据身份证号获取性别
+ * 只支持15或18位身份证号码
+ * @param idCard 身份证号
+ * @return 性别(1 : 男 , 0 : 女)
+ */
+ public static int getGender(String idCard) {
+ if (!isIDCard(idCard)) {
+ throw new IllegalArgumentException("Invalid IDCard");
+ }
+
+ int len = idCard.length();
+ if (len == 15) {
+ idCard = convert15To18(idCard);
+ }
+
+ char sCardChar = Objects.requireNonNull(idCard).charAt(16);
+ return (sCardChar % 2 != 0) ? 1 : 0;
+ }
+
+ /**
+ * 将15位身份证号码转换为18位
+ * @param idCard 15位身份证号
+ * @return 18位身份证号
+ */
+ public static String convert15To18(String idCard) {
+ if (!isIDCard(idCard)) {
+ throw new IllegalArgumentException("Invalid IDCard");
+ }
+ if (idCard.length() != 15) {
+ return null;
+ }
+
+ String birthday = "19" + idCard.substring(6, 12);
+
+ StringBuffer idCard18 = new StringBuffer();
+ idCard18.append(idCard, 0, 6).append(birthday.substring(0, 4)).append(idCard.substring(8));
+
+ // 获取校验位
+ char val = getCheckCode18(idCard18.toString());
+ idCard18.append(val);
+
+ return idCard18.toString();
+ }
+
+ /**
+ * 根据身份证号获取户籍省份编码
+ * 只支持15或18位身份证号码
+ * @param idCard 身份证码
+ * @return 省份编码
+ */
+ public static String getProvinceCode(String idCard) {
+ int len = idCard.length();
+
+ if (len == 15 || len == 18) {
+ return idCard.substring(0, 2);
+ }
+
+ return null;
+ }
+
+ /**
+ * 根据身份编号获取户籍省份,只支持15或18位身份证号码
+ *
+ * @param idCard 身份证号
+ * @return 省份名称
+ */
+ public static String getProvince(String idCard) {
+ String code = getProvinceCode(idCard);
+
+ if (StringUtils.isNotBlank(code)) {
+ return PROVINCE_CODES.get(code);
+ }
+
+ return null;
+ }
+
+ /**
+ * 根据身份编号获取地市级编码,只支持15或18位身份证号码
+ * 获取编码为4位
+ * @param idCard 身份证号
+ * @return 地市级编码
+ */
+ public static String getCityCode(String idCard) {
+ int len = idCard.length();
+
+ if (len == 15 || len == 18) {
+ return idCard.substring(0, 4);
+ }
+
+ return null;
+ }
+
+ /**
+ * 根据身份编号获取区县级编码,只支持15或18位身份证号码
+ * 获取编码为6位
+ * @param idCard 身份证号
+ * @return 地市级编码
+ */
+ public static String getDistrictCode(String idCard) {
+ int len = idCard.length();
+
+ if (len == 15 || len == 18) {
+ return idCard.substring(0, 6);
+ }
+
+ return null;
+ }
+
+ /**
+ *
+ * 判断18位身份证的合法性
+ *
+ * 根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。
+ * 排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
+ *
+ * 顺序码: 表示在同一地址码所标识的区域范围内,对同年、同月、同 日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配 给女性。
+ *
+ *
+ * - 第1、2位数字表示:所在省份的代码
+ * - 第3、4位数字表示:所在城市的代码
+ * - 第5、6位数字表示:所在区县的代码
+ * - 第7~14位数字表示:出生年、月、日
+ * - 第15、16位数字表示:所在地的派出所的代码
+ * - 第17位数字表示性别:奇数表示男性,偶数表示女性
+ * - 第18位数字是校检码,用来检验身份证的正确性。校检码可以是0~9的数字,有时也用x表示
+ *
+ *
+ * 第十八位数字(校验码)的计算方法为:
+ *
+ * - 将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
+ * - 将这17位数字和系数相乘的结果相加
+ * - 用加出来和除以11,看余数是多少
+ * - 余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2
+ * - 通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2
+ *
+ *
+ * @param idCard 待验证的身份证
+ * @param ignoreCase 是否忽略大小写。{@code true}则忽略X大小写,否则严格匹配大写。
+ * @return 是否有效的18位身份证
+ */
+ private static boolean isIDCard18(String idCard) {
+ // 省份
+ final String proCode = idCard.substring(0, 2);
+ if (null == PROVINCE_CODES.get(proCode)) {
+ return false;
+ }
+
+ // 校验生日
+ String birthday = idCard.substring(6, 14);
+ int year = Integer.parseInt(birthday.substring(0, 4));
+ int month = Integer.parseInt(birthday.substring(4, 6));
+ int day = Integer.parseInt(birthday.substring(6, 8));
+ if (!isBirthday(year, month, day)) {
+ return false;
+ }
+
+ // 前17位
+ final String code17 = idCard.substring(0, 17);
+ if (CheckUtils.isNumber(code17)) {
+ // 获取校验位
+ char val = getCheckCode18(code17);
+ // 第18位
+ return Character.toLowerCase(val) == Character.toLowerCase(idCard.charAt(17));
+ }
+ return false;
+ }
+
+ /**
+ * 验证15位身份证号是否合法
+ * @param idCard
+ * @return
+ */
+ private static boolean isIDCard15(String idCard) {
+ if (CheckUtils.isNumber(idCard)) {
+ // 省份
+ String proCode = idCard.substring(0, 2);
+ if (null == PROVINCE_CODES.get(proCode)) {
+ return false;
+ }
+
+ // 校验生日(两位年份,补充为19XX)
+ String birthday = "19" + idCard.substring(6, 12);
+ int year = Integer.parseInt(birthday.substring(0, 4));
+ int month = Integer.parseInt(birthday.substring(4, 6));
+ int day = Integer.parseInt(birthday.substring(6, 8));
+
+ return isBirthday(year, month, day);
+ }
+
+ return false;
+ }
+
+ /**
+ * 验证10位身份证号是否合法
+ *
+ * @param idCard 身份证号
+ * @return 身份证信息数组
+ *
+ * [0] - 台湾、澳门、香港 [1] - 性别(男M,女F,未知N) [2] - 是否合法(合法true,不合法false) 若不是身份证件号码则返回null
+ *
+ */
+ private static String[] isIDCard10(String idCard) {
+ String[] info = new String[3];
+ String card = idCard.replaceAll("[()]", "");
+ if (card.length() != 8 && card.length() != 9 && idCard.length() != 10) {
+ return null;
+ }
+
+ // 台湾
+ if (idCard.matches("^[a-zA-Z][0-9]{9}$")) {
+ info[0] = "台湾";
+ char char2 = idCard.charAt(1);
+ if ('1' == char2) {
+ info[1] = "M";
+ } else if ('2' == char2) {
+ info[1] = "F";
+ } else {
+ info[1] = "N";
+ info[2] = "false";
+ return info;
+ }
+ info[2] = isTWIDCard(idCard) ? "true" : "false";
+ }
+ // 澳门
+ else if (idCard.matches("^[157][0-9]{6}\\(?[0-9A-Z]\\)?$")) {
+ info[0] = "澳门";
+ info[1] = "N";
+ info[2] = "true";
+ }
+ // 香港
+ else if (idCard.matches("^[A-Z]{1,2}[0-9]{6}\\(?[0-9A]\\)?$")) {
+ info[0] = "香港";
+ info[1] = "N";
+ info[2] = isHKIDCard(idCard) ? "true" : "false";
+ }
+ else {
+ return null;
+ }
+
+ return info;
+ }
+
+ /**
+ * 验证香港身份证号码(存在Bug,部份特殊身份证无法检查)
+ *
+ * 身份证前2位为英文字符,如果只出现一个英文字符则表示第一位是空格,对应数字58 前2位英文字符A-Z分别对应数字10-35 最后一位校验码为0-9的数字加上字符"A","A"代表10
+ *
+ *
+ * 将身份证号码全部转换为数字,分别对应乘9-1相加的总和,整除11则证件号码有效
+ *
+ *
+ * @param idCard 身份证号码
+ * @return 验证码是否符合
+ */
+ private static boolean isHKIDCard(String idCard) {
+ String card = idCard.replaceAll("[()]", "");
+ int sum;
+ if (card.length() == 9) {
+ sum = (Character.toUpperCase(card.charAt(0)) - 55) * 9 + (Character.toUpperCase(card.charAt(1)) - 55) * 8;
+ card = card.substring(1, 9);
+ } else {
+ sum = 522 + (Character.toUpperCase(card.charAt(0)) - 55) * 8;
+ }
+
+ // 首字母A-Z,A表示1,以此类推
+ String mid = card.substring(1, 7);
+ String end = card.substring(7, 8);
+ char[] chars = mid.toCharArray();
+ int iflag = 7;
+ for (char c : chars) {
+ sum = sum + Integer.parseInt(String.valueOf(c)) * iflag;
+ iflag--;
+ }
+
+ if ("A".equalsIgnoreCase(end)) {
+ sum += 10;
+ } else {
+ sum += Integer.parseInt(end);
+ }
+
+ return sum % 11 == 0;
+ }
+
+ /**
+ * 验证台湾身份证号码
+ * @param idCard
+ * @return
+ */
+ private static boolean isTWIDCard(String idCard) {
+ Integer iStart = TW_FIRST_CODE.get(idCard.charAt(0));
+ if (null == iStart) {
+ return false;
+ }
+ int sum = iStart / 10 + (iStart % 10) * 9;
+
+ String mid = idCard.substring(1, 9);
+ char[] chars = mid.toCharArray();
+ int iflag = 8;
+ for (char c : chars) {
+ sum += Integer.parseInt(String.valueOf(c)) * iflag;
+ iflag--;
+ }
+
+ String end = idCard.substring(9, 10);
+ return (sum % 10 == 0 ? 0 : (10 - sum % 10)) == Integer.parseInt(end);
+ }
+
+ /**
+ * 获得18位身份证校验码
+ * @param code17 18位身份证号中的前17位
+ * @return 第18位
+ */
+ private static char getCheckCode18(String code17) {
+ int sum = getPowerSum(code17.toCharArray());
+ return getCheckCode18(sum);
+ }
+
+ /**
+ * 将身份证的每位和对应位的加权因子相乘之后,再得到和值
+ * @param iArr 身份证号码的数组
+ * @return 身份证编码
+ */
+ private static int getPowerSum(char[] iArr) {
+ int sum = 0;
+ if (POWER.length == iArr.length) {
+ for (int i = 0; i < iArr.length; i++) {
+ sum += Integer.parseInt(String.valueOf(iArr[i])) * POWER[i];
+ }
+ }
+ return sum;
+ }
+
+ /**
+ * 将power和值与11取模获得余数进行校验码判断
+ * @param sum 加权和
+ * @return 校验位
+ */
+ private static char getCheckCode18(int sum) {
+ switch (sum % 11) {
+ case 10:
+ return '2';
+ case 9:
+ return '3';
+ case 8:
+ return '4';
+ case 7:
+ return '5';
+ case 6:
+ return '6';
+ case 5:
+ return '7';
+ case 4:
+ return '8';
+ case 3:
+ return '9';
+ case 2:
+ return 'X';
+ case 1:
+ return '0';
+ case 0:
+ return '1';
+ default:
+ return ' ';
+ }
+ }
+
+ /**
+ * 验证是否为生日
+ * @param year 年,从1900年开始计算
+ * @param month 月,从1开始计数
+ * @param day 日,从1开始计数
+ * @return 是否为生日
+ */
+ private static boolean isBirthday(int year, int month, int day) {
+ // 验证年
+ int thisYear = DateUtils.getYear();
+ if (year < 1900 || year > thisYear) {
+ return false;
+ }
+
+ // 验证月
+ if (month < 1 || month > 12) {
+ return false;
+ }
+
+ // 验证日
+ if (day < 1 || day > 31) {
+ return false;
+ }
+ // 检查几个特殊月的最大天数
+ if (day == 31 && (month == 4 || month == 6 || month == 9 || month == 11)) {
+ return false;
+ }
+ // 2月,非闰年最大28,闰年最大29
+ if (month == 2) {
+ return day < 29 || (day == 29 && DateUtils.isLeapYear(year));
+ }
+
+ return true;
+ }
+
+}
diff --git a/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java b/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java
deleted file mode 100644
index 769b696..0000000
--- a/htool-core/src/main/java/cn/javaex/htool/regular/RegularUtil.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package cn.javaex.htool.regular;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * 常用正则表达式
- *
- * @author 杨伟辰
- * @Date 2022年11月27日16:32:36
- */
-public class RegularUtil {
-
- /**
- * 中文 正则
- */
- private static Pattern ZH_Pattern = Pattern.compile("[\u4e00-\u9fa5]");
-
- /**
- * 匹配正则
- *
- * @param regular 正则规则
- * @param msg 内容
- * @return 返回所有匹配结果
- */
- public static List getRegular(String regular, String msg) {
- ArrayList ids = new ArrayList<>();
- Pattern pattern = Pattern.compile(regular);
- Matcher matcher = pattern.matcher(msg);
- while (matcher.find()) {
- String str = matcher.group(0);
- ids.add(str);
- }
- return ids;
- }
-
- /**
- * 获取URL中的参数名和参数值的Map集合
- *
- * @param url url
- * @return 返回Map集合保存
- */
- private static Map getUrlPramNameAndValue(String url) {
- //匹配参数名和参数值的正则表达式
- String regEx = "(\\?|&+)(.+?)=([^&]*)";
- Pattern p = Pattern.compile(regEx);
- Matcher m = p.matcher(url);
- // LinkedHashMap是有序的Map集合,遍历时会按照加入的顺序遍历输出
- Map paramMap = new LinkedHashMap();
- while (m.find()) {
- //获取参数名
- String paramName = m.group(2);
- //获取参数值
- String paramVal = m.group(3);
- paramMap.put(paramName, paramVal);
- }
- return paramMap;
- }
-
- /**
- * 传过来一堆字符串,就算有html标签也行,可以提取里面包含图片格式的url
- * 常用在提取富文本中的图片链接
- *
- * @param htmlStr html字符
- * @return
- */
- public static List getImgStr(String htmlStr) {
- List list = new ArrayList<>();
- String img = "";
- Pattern pImage;
- Matcher mImage;
- String regExImg = "]*?>";
- pImage = Pattern.compile(regExImg, Pattern.CASE_INSENSITIVE);
- mImage = pImage.matcher(htmlStr);
- while (mImage.find()) {
- // 得到
数据
- img = mImage.group();
- // 匹配
中的src数据
- String regEx = "src\\s*=\\s*\"?(.*?)(\"|>|\\s+)";
- Matcher m = Pattern.compile(regEx).matcher(img);
- while (m.find()) {
- list.add(m.group(1));
- }
- }
- return list;
- }
-
- /**
- * 判断字符串中是否包含中文
- *
- * @param str 待校验字符串
- * @return 是否为中文
- * @warn 不能校验是否为中文标点符号
- */
- public static boolean isContainChinese(String str) {
- Matcher m = ZH_Pattern.matcher(str);
- if (m.find()) {
- return true;
- }
- return false;
- }
-}
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java
index bccc26b..a7c8e48 100644
--- a/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java
+++ b/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java
@@ -1,5 +1,311 @@
-package cn.javaex.htool.http;
-
-public class HttpUtils {
-
-}
+//package cn.javaex.htool.http;
+//
+//import java.io.UnsupportedEncodingException;
+//import java.net.URLEncoder;
+//import java.security.KeyManagementException;
+//import java.security.NoSuchAlgorithmException;
+//import java.security.cert.X509Certificate;
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.Map;
+//
+//import javax.net.ssl.SSLContext;
+//import javax.net.ssl.TrustManager;
+//import javax.net.ssl.X509TrustManager;
+//
+//import org.apache.http.HttpResponse;
+//import org.apache.http.NameValuePair;
+//import org.apache.http.client.HttpClient;
+//import org.apache.http.client.entity.UrlEncodedFormEntity;
+//import org.apache.http.client.methods.HttpDelete;
+//import org.apache.http.client.methods.HttpGet;
+//import org.apache.http.client.methods.HttpPost;
+//import org.apache.http.client.methods.HttpPut;
+//import org.apache.http.conn.ClientConnectionManager;
+//import org.apache.http.conn.scheme.Scheme;
+//import org.apache.http.conn.scheme.SchemeRegistry;
+//import org.apache.http.conn.ssl.SSLSocketFactory;
+//import org.apache.http.entity.ByteArrayEntity;
+//import org.apache.http.entity.StringEntity;
+//import org.apache.http.impl.client.DefaultHttpClient;
+//import org.apache.http.message.BasicNameValuePair;
+//
+//public class HttpUtils {
+//
+// /**
+// * get
+// *
+// * @param host
+// * @param path
+// * @param method
+// * @param headers
+// * @param querys
+// * @return
+// * @throws Exception
+// */
+// public static HttpResponse doGet(String host, String path, String method,
+// Map headers,
+// Map querys)
+// throws Exception {
+// HttpClient httpClient = wrapClient(host);
+//
+// HttpGet request = new HttpGet(buildUrl(host, path, querys));
+// for (Map.Entry e : headers.entrySet()) {
+// request.addHeader(e.getKey(), e.getValue());
+// }
+//
+// return httpClient.execute(request);
+// }
+//
+// /**
+// * post form
+// *
+// * @param host
+// * @param path
+// * @param method
+// * @param headers
+// * @param querys
+// * @param bodys
+// * @return
+// * @throws Exception
+// */
+// public static HttpResponse doPost(String host, String path, String method,
+// Map headers,
+// Map querys,
+// Map bodys)
+// throws Exception {
+// HttpClient httpClient = wrapClient(host);
+//
+// HttpPost request = new HttpPost(buildUrl(host, path, querys));
+// for (Map.Entry e : headers.entrySet()) {
+// request.addHeader(e.getKey(), e.getValue());
+// }
+//
+// if (bodys != null) {
+// List nameValuePairList = new ArrayList();
+//
+// for (String key : bodys.keySet()) {
+// nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
+// }
+// UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
+// formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
+// request.setEntity(formEntity);
+// }
+//
+// return httpClient.execute(request);
+// }
+//
+// /**
+// * Post String
+// *
+// * @param host
+// * @param path
+// * @param method
+// * @param headers
+// * @param querys
+// * @param body
+// * @return
+// * @throws Exception
+// */
+// public static HttpResponse doPost(String host, String path, String method,
+// Map headers,
+// Map querys,
+// String body)
+// throws Exception {
+// HttpClient httpClient = wrapClient(host);
+//
+// HttpPost request = new HttpPost(buildUrl(host, path, querys));
+// for (Map.Entry e : headers.entrySet()) {
+// request.addHeader(e.getKey(), e.getValue());
+// }
+//
+// if (StringUtils.isNotBlank(body)) {
+// request.setEntity(new StringEntity(body, "utf-8"));
+// }
+//
+// return httpClient.execute(request);
+// }
+//
+// /**
+// * Post stream
+// *
+// * @param host
+// * @param path
+// * @param method
+// * @param headers
+// * @param querys
+// * @param body
+// * @return
+// * @throws Exception
+// */
+// public static HttpResponse doPost(String host, String path, String method,
+// Map headers,
+// Map querys,
+// byte[] body)
+// throws Exception {
+// HttpClient httpClient = wrapClient(host);
+//
+// HttpPost request = new HttpPost(buildUrl(host, path, querys));
+// for (Map.Entry e : headers.entrySet()) {
+// request.addHeader(e.getKey(), e.getValue());
+// }
+//
+// if (body != null) {
+// request.setEntity(new ByteArrayEntity(body));
+// }
+//
+// return httpClient.execute(request);
+// }
+//
+// /**
+// * Put String
+// * @param host
+// * @param path
+// * @param method
+// * @param headers
+// * @param querys
+// * @param body
+// * @return
+// * @throws Exception
+// */
+// public static HttpResponse doPut(String host, String path, String method,
+// Map headers,
+// Map querys,
+// String body)
+// throws Exception {
+// HttpClient httpClient = wrapClient(host);
+//
+// HttpPut request = new HttpPut(buildUrl(host, path, querys));
+// for (Map.Entry e : headers.entrySet()) {
+// request.addHeader(e.getKey(), e.getValue());
+// }
+//
+// if (StringUtils.isNotBlank(body)) {
+// request.setEntity(new StringEntity(body, "utf-8"));
+// }
+//
+// return httpClient.execute(request);
+// }
+//
+// /**
+// * Put stream
+// * @param host
+// * @param path
+// * @param method
+// * @param headers
+// * @param querys
+// * @param body
+// * @return
+// * @throws Exception
+// */
+// public static HttpResponse doPut(String host, String path, String method,
+// Map headers,
+// Map querys,
+// byte[] body)
+// throws Exception {
+// HttpClient httpClient = wrapClient(host);
+//
+// HttpPut request = new HttpPut(buildUrl(host, path, querys));
+// for (Map.Entry e : headers.entrySet()) {
+// request.addHeader(e.getKey(), e.getValue());
+// }
+//
+// if (body != null) {
+// request.setEntity(new ByteArrayEntity(body));
+// }
+//
+// return httpClient.execute(request);
+// }
+//
+// /**
+// * Delete
+// *
+// * @param host
+// * @param path
+// * @param method
+// * @param headers
+// * @param querys
+// * @return
+// * @throws Exception
+// */
+// public static HttpResponse doDelete(String host, String path, String method,
+// Map headers,
+// Map querys)
+// throws Exception {
+// HttpClient httpClient = wrapClient(host);
+//
+// HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
+// for (Map.Entry e : headers.entrySet()) {
+// request.addHeader(e.getKey(), e.getValue());
+// }
+//
+// return httpClient.execute(request);
+// }
+//
+// private static String buildUrl(String host, String path, Map querys) throws UnsupportedEncodingException {
+// StringBuilder sbUrl = new StringBuilder();
+// sbUrl.append(host);
+// if (!StringUtils.isBlank(path)) {
+// sbUrl.append(path);
+// }
+// if (null != querys) {
+// StringBuilder sbQuery = new StringBuilder();
+// for (Map.Entry query : querys.entrySet()) {
+// if (0 < sbQuery.length()) {
+// sbQuery.append("&");
+// }
+// if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
+// sbQuery.append(query.getValue());
+// }
+// if (!StringUtils.isBlank(query.getKey())) {
+// sbQuery.append(query.getKey());
+// if (!StringUtils.isBlank(query.getValue())) {
+// sbQuery.append("=");
+// sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
+// }
+// }
+// }
+// if (0 < sbQuery.length()) {
+// sbUrl.append("?").append(sbQuery);
+// }
+// }
+//
+// return sbUrl.toString();
+// }
+//
+// private static HttpClient wrapClient(String host) {
+// HttpClient httpClient = new DefaultHttpClient();
+// if (host.startsWith("https://")) {
+// sslClient(httpClient);
+// }
+//
+// return httpClient;
+// }
+//
+// private static void sslClient(HttpClient httpClient) {
+// try {
+// SSLContext ctx = SSLContext.getInstance("TLS");
+// X509TrustManager tm = new X509TrustManager() {
+// public X509Certificate[] getAcceptedIssuers() {
+// return null;
+// }
+// public void checkClientTrusted(X509Certificate[] xcs, String str) {
+//
+// }
+// public void checkServerTrusted(X509Certificate[] xcs, String str) {
+//
+// }
+// };
+// ctx.init(null, new TrustManager[] { tm }, null);
+// SSLSocketFactory ssf = new SSLSocketFactory(ctx);
+// ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+// ClientConnectionManager ccm = httpClient.getConnectionManager();
+// SchemeRegistry registry = ccm.getSchemeRegistry();
+// registry.register(new Scheme("https", 443, ssf));
+// } catch (KeyManagementException ex) {
+// throw new RuntimeException(ex);
+// } catch (NoSuchAlgorithmException ex) {
+// throw new RuntimeException(ex);
+// }
+// }
+//}
--
Gitee
From 7444ba05caf21685d7b6fc62c1887a21bc714191 Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Tue, 3 Jan 2023 14:31:53 +0800
Subject: [PATCH 36/44] =?UTF-8?q?=E5=B0=86=E6=96=87=E4=BB=B6=E8=A7=A3?=
=?UTF-8?q?=E5=8E=8B=E7=BC=A9=E5=8D=95=E7=8B=AC=E6=8F=90=E5=8F=96=E4=B8=80?=
=?UTF-8?q?=E4=B8=AA=E5=B7=A5=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cn/javaex/htool/core/io/FileUtils.java | 154 ----------------
.../cn/javaex/htool/core/io/ZipUtils.java | 174 ++++++++++++++++++
.../htool/core/io/handler/FileHelper.java | 5 +
.../javaex/htool/core/regular/CheckUtils.java | 2 +-
4 files changed, 180 insertions(+), 155 deletions(-)
create mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
index 4c41148..0cdbc98 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
@@ -5,7 +5,6 @@ import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -15,11 +14,7 @@ import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
-import java.util.Enumeration;
import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@@ -38,8 +33,6 @@ import cn.javaex.htool.core.string.StringUtils;
* @Date 2022年12月1日
*/
public class FileUtils extends FileHelper {
- /** 默认缓冲区大小 */
- private static final int BUFFER_SIZE = 1024;
/**
* 递归删除文件或目录(目录本身也删除)
@@ -509,153 +502,6 @@ public class FileUtils extends FileHelper {
}
}
- /**
- * 创建一个zip压缩文件,并存放到新的路径中
- * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx
- * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip
- * @throws IOException
- */
- public static void zip(String srcPath, String zipPath) throws IOException {
- zip(srcPath, zipPath, true);
- }
-
- /**
- * 创建一个zip压缩文件,并存放到新的路径中
- * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx
- * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip
- * @param isKeepFolder 是否将目录名称也一起压缩
- * @throws IOException
- */
- public static void zip(String srcPath, String zipPath, boolean isKeepFolder) throws IOException {
- File srcFile = new File(srcPath);
- FileHandler.requireExists(srcFile);
-
- File zipFile = new File(zipPath);
- // 如果压缩包已存在,则先删除
- if (zipFile.exists()) {
- deleteFileOrDirectory(zipFile);
- }
-
- byte[] buffer = new byte[BUFFER_SIZE * 10];
- FileInputStream fis = null;
- BufferedInputStream bis = null;
- FileOutputStream fos = null;
- ZipOutputStream zos = null;
-
- try {
- // 判断是否是一个具体的文件
- if (srcFile.isFile()) {
- fos = new FileOutputStream(zipFile);
- zos = new ZipOutputStream(new BufferedOutputStream(fos));
-
- // 创建zip实体,并添加进压缩包
- ZipEntry zipEntry = new ZipEntry(srcFile.getName());
- zos.putNextEntry(zipEntry);
-
- fis = new FileInputStream(srcFile);
- bis = new BufferedInputStream(fis, BUFFER_SIZE * 10);
- int read = 0;
- while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) {
- zos.write(buffer, 0, read);
- }
- zos.flush();
- }
- // 目录
- else if (srcFile.isDirectory()) {
- // 获取文件源中的所有文件
- List fileList = listDeepFiles(srcFile);
-
- fos = new FileOutputStream(zipFile);
- zos = new ZipOutputStream(new BufferedOutputStream(fos));
-
- // 将每个文件放入zip流中
- for (File file : fileList) {
- String name = FileHandler.getRealName(srcPath, file); // 获取文件相对路径,保持文件原有结构
- ZipEntry zipEntry = null;
- if (isKeepFolder) {
- zipEntry = new ZipEntry(new File(srcPath).getName() + File.separator + name);
- } else {
- zipEntry = new ZipEntry(name);
- }
-
- zipEntry.setSize(file.length());
- zos.putNextEntry(zipEntry);
-
- fis = new FileInputStream(file);
- bis = new BufferedInputStream(fis, BUFFER_SIZE * 10);
- int read = 0;
- while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) {
- zos.write(buffer, 0, read);
- }
-
- zos.flush();
- bis.close();
- fis.close();
- }
- zos.close();
- }
- } catch (IOException e) {
- throw new IOException(e);
- } finally {
- IOUtils.closeQuietly(zos);
- IOUtils.closeQuietly(fos);
- IOUtils.closeQuietly(bis);
- IOUtils.closeQuietly(fis);
- }
- }
-
- /**
- * zip解压
- * @param zipPath zip文件的绝对路径,例如:D:\\Temp\\xx.zip
- * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Temp
- * @throws IOException
- */
- public static void unZip(String zipPath, String destDirPath) throws IOException {
- File file = new File(zipPath);
- FileHandler.requireFile(file);
-
- byte[] buffer = new byte[BUFFER_SIZE * 10];
- ZipFile zipFile = null;
-
- try {
- zipFile = new ZipFile(zipPath);
- Enumeration> entries = zipFile.entries();
- while (entries.hasMoreElements()) {
- ZipEntry entry = (ZipEntry) entries.nextElement();
- // 如果是文件夹,就创建个文件夹
- if (entry.isDirectory()) {
- String dirPath = destDirPath + File.separator + entry.getName();
- File dir = new File(dirPath);
- dir.mkdirs();
- } else {
- // 如果是文件,就先创建一个文件,然后用io流把内容copy过去
- File targetFile = new File(destDirPath + File.separator + entry.getName());
- // 保证这个文件的父文件夹必须要存在
- if (!targetFile.getParentFile().exists()) {
- targetFile.getParentFile().mkdirs();
- }
- targetFile.createNewFile();
- // 将压缩文件内容写入到这个文件中
- InputStream in = zipFile.getInputStream(entry);
- BufferedInputStream bis = new BufferedInputStream(in, BUFFER_SIZE * 10);
- FileOutputStream fos = new FileOutputStream(targetFile);
-
- int read;
- while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) {
- fos.write(buffer, 0, read);
- }
-
- fos.close();
- in.close();
- }
- }
- } catch (IOException e) {
- throw new IOException(e);
- } finally {
- IOUtils.closeQuietly(zipFile);
- }
- }
-
/**
* 下载resources文件夹下的文件(不重命名)
* @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java
new file mode 100644
index 0000000..58f2120
--- /dev/null
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/ZipUtils.java
@@ -0,0 +1,174 @@
+package cn.javaex.htool.core.io;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+import cn.javaex.htool.core.io.handler.FileHandler;
+import cn.javaex.htool.core.io.handler.FileHelper;
+
+/**
+ * 文件压缩工具类
+ *
+ * @author 陈霓清
+ * @Date 2023年1月3日
+ */
+public class ZipUtils extends FileHelper {
+
+ /**
+ * 创建一个zip压缩文件,并存放到新的路径中
+ * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx
+ * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip
+ * @throws IOException
+ */
+ public static void zip(String srcPath, String zipPath) throws IOException {
+ zip(srcPath, zipPath, true);
+ }
+
+ /**
+ * 创建一个zip压缩文件,并存放到新的路径中
+ * @param srcPath 源目录或文件的绝对路径,例如:D:\\Temp 或 D:\\Temp\\1.docx
+ * @param zipPath 压缩后的文件绝对路径,例如:D:\\Temp\\xx.zip
+ * @param isKeepFolder 是否将目录名称也一起压缩
+ * @throws IOException
+ */
+ public static void zip(String srcPath, String zipPath, boolean isKeepFolder) throws IOException {
+ File srcFile = new File(srcPath);
+ FileHandler.requireExists(srcFile);
+
+ File zipFile = new File(zipPath);
+ // 如果压缩包已存在,则先删除
+ if (zipFile.exists()) {
+ FileUtils.deleteFileOrDirectory(zipFile);
+ }
+
+ byte[] buffer = new byte[BUFFER_SIZE * 10];
+ FileInputStream fis = null;
+ BufferedInputStream bis = null;
+ FileOutputStream fos = null;
+ ZipOutputStream zos = null;
+
+ try {
+ // 判断是否是一个具体的文件
+ if (srcFile.isFile()) {
+ fos = new FileOutputStream(zipFile);
+ zos = new ZipOutputStream(new BufferedOutputStream(fos));
+
+ // 创建zip实体,并添加进压缩包
+ ZipEntry zipEntry = new ZipEntry(srcFile.getName());
+ zos.putNextEntry(zipEntry);
+
+ fis = new FileInputStream(srcFile);
+ bis = new BufferedInputStream(fis, BUFFER_SIZE * 10);
+ int read = 0;
+ while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) {
+ zos.write(buffer, 0, read);
+ }
+ zos.flush();
+ }
+ // 目录
+ else if (srcFile.isDirectory()) {
+ // 获取文件源中的所有文件
+ List fileList = FileUtils.listDeepFiles(srcFile);
+
+ fos = new FileOutputStream(zipFile);
+ zos = new ZipOutputStream(new BufferedOutputStream(fos));
+
+ // 将每个文件放入zip流中
+ for (File file : fileList) {
+ String name = FileHandler.getRealName(srcPath, file); // 获取文件相对路径,保持文件原有结构
+ ZipEntry zipEntry = null;
+ if (isKeepFolder) {
+ zipEntry = new ZipEntry(new File(srcPath).getName() + File.separator + name);
+ } else {
+ zipEntry = new ZipEntry(name);
+ }
+
+ zipEntry.setSize(file.length());
+ zos.putNextEntry(zipEntry);
+
+ fis = new FileInputStream(file);
+ bis = new BufferedInputStream(fis, BUFFER_SIZE * 10);
+ int read = 0;
+ while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) {
+ zos.write(buffer, 0, read);
+ }
+
+ zos.flush();
+ bis.close();
+ fis.close();
+ }
+ zos.close();
+ }
+ } catch (IOException e) {
+ throw new IOException(e);
+ } finally {
+ IOUtils.closeQuietly(zos);
+ IOUtils.closeQuietly(fos);
+ IOUtils.closeQuietly(bis);
+ IOUtils.closeQuietly(fis);
+ }
+ }
+
+ /**
+ * zip解压
+ * @param zipPath zip文件的绝对路径,例如:D:\\Temp\\xx.zip
+ * @param destDirPath 解压后的目标文件夹路径,例如:D:\\Temp
+ * @throws IOException
+ */
+ public static void unZip(String zipPath, String destDirPath) throws IOException {
+ File file = new File(zipPath);
+ FileHandler.requireFile(file);
+
+ byte[] buffer = new byte[BUFFER_SIZE * 10];
+ ZipFile zipFile = null;
+
+ try {
+ zipFile = new ZipFile(zipPath);
+ Enumeration> entries = zipFile.entries();
+ while (entries.hasMoreElements()) {
+ ZipEntry entry = (ZipEntry) entries.nextElement();
+ // 如果是文件夹,就创建个文件夹
+ if (entry.isDirectory()) {
+ String dirPath = destDirPath + File.separator + entry.getName();
+ File dir = new File(dirPath);
+ dir.mkdirs();
+ } else {
+ // 如果是文件,就先创建一个文件,然后用io流把内容copy过去
+ File targetFile = new File(destDirPath + File.separator + entry.getName());
+ // 保证这个文件的父文件夹必须要存在
+ if (!targetFile.getParentFile().exists()) {
+ targetFile.getParentFile().mkdirs();
+ }
+ targetFile.createNewFile();
+ // 将压缩文件内容写入到这个文件中
+ InputStream in = zipFile.getInputStream(entry);
+ BufferedInputStream bis = new BufferedInputStream(in, BUFFER_SIZE * 10);
+ FileOutputStream fos = new FileOutputStream(targetFile);
+
+ int read;
+ while ((read=bis.read(buffer, 0, BUFFER_SIZE * 10)) != -1) {
+ fos.write(buffer, 0, read);
+ }
+
+ fos.close();
+ in.close();
+ }
+ }
+ } catch (IOException e) {
+ throw new IOException(e);
+ } finally {
+ IOUtils.closeQuietly(zipFile);
+ }
+ }
+
+}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java
index cc0c4ab..08d8bfc 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/FileHelper.java
@@ -10,6 +10,11 @@ import java.util.regex.Pattern;
* @Date 2022年12月8日
*/
public class FileHelper {
+ /**
+ * 默认缓冲区大小
+ */
+ public static final int BUFFER_SIZE = 1024;
+
/**
* 文件扩展分隔符(字符)
*/
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java
index f307767..6346cfc 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/regular/CheckUtils.java
@@ -5,7 +5,7 @@ import java.util.regex.Pattern;
import cn.javaex.htool.core.string.IDCardUtils;
/**
- * 文字校验工具类
+ * 字符串校验工具类
*
* @author 陈霓清
* @Date 2023年1月2日
--
Gitee
From b55668c5d962a367cd332feb5c783e7a423d8eec Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Tue, 3 Jan 2023 14:43:27 +0800
Subject: [PATCH 37/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9base64=E5=92=8CID?=
=?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E7=9A=84=E8=B7=AF=E5=BE=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/javaex/htool/core/{ => codec}/Base64Utils.java | 2 +-
.../src/main/java/cn/javaex/htool/core/{ => id}/IdUtils.java | 2 +-
.../src/main/java/cn/javaex/htool/crypto/rsa/RSA.java | 2 +-
.../src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java | 2 +-
.../src/main/java/cn/javaex/htool/crypto/sign/Sign.java | 2 +-
.../src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java | 2 +-
.../cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java | 2 +-
.../cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java | 2 +-
.../src/main/java/cn/javaex/htool/picture/PictureUtils.java | 4 ++--
9 files changed, 10 insertions(+), 10 deletions(-)
rename htool-core/src/main/java/cn/javaex/htool/core/{ => codec}/Base64Utils.java (98%)
rename htool-core/src/main/java/cn/javaex/htool/core/{ => id}/IdUtils.java (99%)
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java b/htool-core/src/main/java/cn/javaex/htool/core/codec/Base64Utils.java
similarity index 98%
rename from htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java
rename to htool-core/src/main/java/cn/javaex/htool/core/codec/Base64Utils.java
index fb9bbc7..63e60a0 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/Base64Utils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/codec/Base64Utils.java
@@ -1,4 +1,4 @@
-package cn.javaex.htool.core;
+package cn.javaex.htool.core.codec;
import java.util.Base64;
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/id/IdUtils.java
similarity index 99%
rename from htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java
rename to htool-core/src/main/java/cn/javaex/htool/core/id/IdUtils.java
index 89e9f14..ba32b83 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/IdUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/id/IdUtils.java
@@ -1,4 +1,4 @@
-package cn.javaex.htool.core;
+package cn.javaex.htool.core.id;
import java.net.InetAddress;
import java.net.NetworkInterface;
diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java
index 24ae176..bcd3440 100644
--- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java
+++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSA.java
@@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
-import cn.javaex.htool.core.Base64Utils;
+import cn.javaex.htool.core.codec.Base64Utils;
import cn.javaex.htool.core.string.StringUtils;
/**
diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java
index 13f7638..cf42954 100644
--- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java
+++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/rsa/RSAUtils.java
@@ -9,7 +9,7 @@ import java.util.List;
import javax.crypto.Cipher;
-import cn.javaex.htool.core.Base64Utils;
+import cn.javaex.htool.core.codec.Base64Utils;
import cn.javaex.htool.core.string.StringUtils;
/**
diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java
index 355c855..8193d63 100644
--- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java
+++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/Sign.java
@@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
-import cn.javaex.htool.core.Base64Utils;
+import cn.javaex.htool.core.codec.Base64Utils;
import cn.javaex.htool.core.string.StringUtils;
/**
diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java
index eec1003..95d1d1f 100644
--- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java
+++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/sign/SignUtils.java
@@ -7,7 +7,7 @@ import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
-import cn.javaex.htool.core.Base64Utils;
+import cn.javaex.htool.core.codec.Base64Utils;
import cn.javaex.htool.core.string.StringUtils;
/**
diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java
index 0a2efa1..8e40f53 100644
--- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java
+++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/AESUtils.java
@@ -4,7 +4,7 @@ import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
-import cn.javaex.htool.core.Base64Utils;
+import cn.javaex.htool.core.codec.Base64Utils;
/**
* AES对称加密
diff --git a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java
index 57da38d..639a635 100644
--- a/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java
+++ b/htool-crypto/src/main/java/cn/javaex/htool/crypto/symmetric_encryption/DESUtils.java
@@ -7,7 +7,7 @@ import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
-import cn.javaex.htool.core.Base64Utils;
+import cn.javaex.htool.core.codec.Base64Utils;
/**
* DES对称加密
diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java
index eee852f..e3e4392 100644
--- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java
+++ b/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java
@@ -1,7 +1,7 @@
package cn.javaex.htool.picture;
-import cn.javaex.htool.core.IdUtils;
-import cn.javaex.htool.core.Base64Utils;
+import cn.javaex.htool.core.codec.Base64Utils;
+import cn.javaex.htool.core.id.IdUtils;
import cn.javaex.htool.picture.util.BufferedImageBuilder;
import javax.imageio.*;
--
Gitee
From d8b33c387b7a81903c8c4aab7b3b9d2f3a325eb4 Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Tue, 3 Jan 2023 16:23:09 +0800
Subject: [PATCH 38/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E7=89=87?=
=?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../{PictureUtils.java => ImageUtils.java} | 143 +++++++++++++++---
1 file changed, 126 insertions(+), 17 deletions(-)
rename htool-picture/src/main/java/cn/javaex/htool/picture/{PictureUtils.java => ImageUtils.java} (71%)
diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java
similarity index 71%
rename from htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java
rename to htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java
index e3e4392..087c38c 100644
--- a/htool-picture/src/main/java/cn/javaex/htool/picture/PictureUtils.java
+++ b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java
@@ -1,12 +1,14 @@
package cn.javaex.htool.picture;
-import cn.javaex.htool.core.codec.Base64Utils;
-import cn.javaex.htool.core.id.IdUtils;
-import cn.javaex.htool.picture.util.BufferedImageBuilder;
-
-import javax.imageio.*;
-import javax.imageio.stream.ImageOutputStream;
-import java.awt.*;
+import java.awt.AlphaComposite;
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.RenderingHints;
+import java.awt.Shape;
+import java.awt.Toolkit;
+import java.awt.Transparency;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
@@ -16,13 +18,30 @@ import java.awt.image.CropImageFilter;
import java.awt.image.FilteredImageSource;
import java.io.ByteArrayOutputStream;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageTypeSpecifier;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.stream.ImageOutputStream;
+
+import cn.javaex.htool.core.codec.Base64Utils;
+import cn.javaex.htool.core.id.IdUtils;
+import cn.javaex.htool.picture.util.BufferedImageBuilder;
/**
* @author 韩建东 2022年11月27日
*/
-public class PictureUtils {
+public class ImageUtils {
/**
* 改变 图片 最低 宽度
*/
@@ -133,7 +152,6 @@ public class PictureUtils {
imageOutputStream.close();
return read;
} catch (Exception e) {
- // TODO: handle exception
e.printStackTrace();
System.err.println("图片压缩失败");
return null;
@@ -153,7 +171,7 @@ public class PictureUtils {
}
/**
- * @author 韩建东
+ * @author 韩建东
* @param srcBuffer 图片流
* @param text 水印文字
* @param color 水印颜色
@@ -205,7 +223,7 @@ public class PictureUtils {
}
/**
- * @author 韩建东
+ * @author 韩建东
* @param srcBuffer 图 流
* @param x 裁剪 x坐标
* @param y 裁剪 y 坐标
@@ -213,7 +231,7 @@ public class PictureUtils {
* @param height 裁剪 高度
* @return BufferedImage
*/
- public static BufferedImage cut(BufferedImage srcBuffer,int x,int y,int width,int height) {
+ public static BufferedImage cut(BufferedImage srcBuffer,int x,int y,int width,int height) {
int picheight = srcBuffer.getHeight();
int picwidth = srcBuffer.getWidth();
if(picheight < y+height || picwidth < x+width) {
@@ -232,21 +250,23 @@ public class PictureUtils {
}
/**
- * 将图片转为 base64 string
+ * 将图片转为 base64 string
* @author 韩建东
* @param srcBuffer
* @return String
*/
- public static String toBase64Str(BufferedImage srcBuffer){
- String base64Str = "";
+ public static String toBase64Str(BufferedImage srcBuffer) {
+ String base64Str = "";
+
try {
ByteArrayOutputStream os = new ByteArrayOutputStream();
- ImageIO.write(srcBuffer,"jpg",os);
+ ImageIO.write(srcBuffer, "jpg", os);
byte[] bytes = os.toByteArray();
- return Base64Utils.encodeByte(bytes);
+ return "data:image/jpeg;base64," + Base64Utils.encodeByte(bytes);
} catch (IOException e) {
System.err.printf("转换base64错误");
}
+
return base64Str;
}
@@ -261,4 +281,93 @@ public class PictureUtils {
public static String rgb2Hex(int r, int g, int b) {
return String.format("#%02X%02X%02X", r, g, b);
}
+
+ /**
+ * base64转url
+ * @author 陈霓清
+ * @param base64Image
+ * @param imageFilePath : "D:\\test\\1.jpg"
+ * @return
+ * @throws IOException
+ */
+ public static void base64ToFile(String base64Image, String imageFilePath) throws IOException {
+ String image = base64Image.substring(22);
+ if (image.startsWith(",")) {
+ image = base64Image.substring(23);
+ }
+
+ byte[] bytes = Base64Utils.decodeByte(image);
+
+ try (OutputStream outStream = new FileOutputStream(imageFilePath)) {
+ outStream.write(bytes);
+ outStream.flush();
+ }
+ }
+
+ /**
+ * 根据图片地址转换为base64编码字符串
+ * @author 陈霓清
+ * @param imageFilePath : "D:\\test\\1.jpg"
+ * @return
+ */
+ public static String toBase64Str(String imageFilePath) {
+ byte[] bytes = null;
+
+ try (InputStream inputStream = new FileInputStream(imageFilePath)) {
+ bytes = new byte[inputStream.available()];
+ inputStream.read(bytes);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ // 返回Base64编码过的字节数组字符串
+ return "data:image/jpeg;base64," + Base64Utils.encodeByte(bytes);
+ }
+
+ /**
+ * 得到网页中图片的地址
+ * @author 陈霓清
+ * @param htmlStr
+ * @return
+ */
+ public static java.util.List listImages(String htmlStr) {
+ java.util.List list = new ArrayList();
+ Pattern p = Pattern.compile("<(img|IMG)(.*?)(>|>|/>)");
+ Matcher matcher = p.matcher(htmlStr);
+ boolean hasPic = matcher.find();
+
+ // 判断是否含有图片
+ if (hasPic) {
+ // 如果含有图片,那么持续进行查找,直到匹配不到
+ while (hasPic) {
+ // 获取第二个分组的内容,也就是 (.*?)匹配到的
+ String group = matcher.group(2);
+ // 匹配图片的地址
+ Pattern srcText = Pattern.compile("(src|SRC)=(\"|\')(.*?)(\"|\')");
+ Matcher matcher2 = srcText.matcher(group);
+ if (matcher2.find()) {
+ try {
+ list.add(matcher2.group(3));
+ } catch (Exception e) {
+
+ }
+ }
+ // 判断是否还有img标签
+ hasPic = matcher.find();
+ }
+ }
+
+ return list;
+ }
+
+ public static void main(String[] args) throws IOException {
+ BufferedImage bufferedImage = ImageIO.read(new File("D:\\test\\1.jpg"));
+ String base64Str = toBase64Str(bufferedImage);
+ System.err.println("base64Str:" + base64Str);
+
+// String base64Str2 = toBase64Str("D:\\test\\1.jpg");
+// System.err.println("base64Str2:" + base64Str2);
+
+ }
+
}
--
Gitee
From 5005bc58bb762c3914d27e380f1e4bf43e0045bc Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Tue, 3 Jan 2023 17:22:04 +0800
Subject: [PATCH 39/44] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E7=89=87?=
=?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cn/javaex/htool/picture/ImageUtils.java | 262 +++++++++---------
1 file changed, 132 insertions(+), 130 deletions(-)
diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java
index 087c38c..1029ed0 100644
--- a/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java
+++ b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java
@@ -8,14 +8,11 @@ import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.Toolkit;
-import java.awt.Transparency;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
+import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
-import java.awt.image.ColorModel;
-import java.awt.image.CropImageFilter;
-import java.awt.image.FilteredImageSource;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
@@ -24,18 +21,13 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
+import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
-import javax.imageio.ImageTypeSpecifier;
-import javax.imageio.ImageWriteParam;
-import javax.imageio.ImageWriter;
-import javax.imageio.stream.ImageOutputStream;
import cn.javaex.htool.core.codec.Base64Utils;
-import cn.javaex.htool.core.id.IdUtils;
import cn.javaex.htool.picture.util.BufferedImageBuilder;
/**
@@ -73,91 +65,6 @@ public class ImageUtils {
*/
private static final int NUM_TWO = 2;
- /**
- * @author 韩建东
- * 自定义修改图片 大小
- *
- * @param srcBuffer 修改的 图片 的流
- * @param width 自定义 变化 的 图片 宽度
- * @param height 自定义 变化 的 图片 高度
- * @return BufferedImage 图片buffer
- */
- public static BufferedImage sizeChange(BufferedImage srcBuffer, int width, int height) {
- if (width < MIN_PIC_WIDTH || height < MIN_PIC_HEIGHT) {
- System.err.println("图片尺寸不能小于10*10");
- return null;
- }
- BufferedImage to = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
- Graphics2D g2d = to.createGraphics();
- to = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
- g2d.dispose();
- g2d = to.createGraphics();
- Image from = srcBuffer.getScaledInstance(width, height, BufferedImage.SCALE_AREA_AVERAGING);
- g2d.drawImage(from, 0, 0, null);
- return to;
- }
-
- /**
- * @author 韩建东
- * 等比例 处理 图片大小尺寸
- *
- * @param srcBuffer 需要处理的图片流
- * @param scale 等比例数值 (0,100] 原尺寸 = 原尺寸*scale
- * @return BufferedImage 图片buffer
- */
- public static BufferedImage sizeProportion(BufferedImage srcBuffer, double scale) {
- int width = srcBuffer.getWidth();
- int height = srcBuffer.getHeight();
- int targetWidth = (int) (width * scale);
- int targetHeight = (int) (height * scale);
- if (targetWidth < MIN_PIC_WIDTH || targetHeight < MIN_PIC_HEIGHT) {
- System.err.println("尺寸不能再缩小");
- return null;
- }
- return sizeChange(srcBuffer, targetWidth, targetHeight);
- }
-
- /**
- * @author 韩建东
- * 图片的压缩 算法
- *
- * @param srcBuffer 图片流
- * @param quality 质量 (0,1]
- * @return BufferedImage
- */
- public static BufferedImage qualityCompress(BufferedImage srcBuffer, float quality) {
- if (quality <= 0 || quality > 1) {
- System.err.println("参数不合法");
- return null;
- }
- ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
- ImageWriteParam imageWriteParam = writer.getDefaultWriteParam();
- ColorModel colorModel = srcBuffer.getColorModel();
- try {
- String uuid = IdUtils.getUUID();
- File tempFile = File.createTempFile("quality_" + uuid, ".jpg");
- FileOutputStream fileOutputStream = new FileOutputStream(tempFile);
- ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(fileOutputStream);
- writer.setOutput(imageOutputStream);
- if (imageWriteParam.canWriteCompressed()) {
- imageWriteParam.setDestinationType(new ImageTypeSpecifier(colorModel, colorModel.createCompatibleSampleModel(16, 16)));
- imageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
- imageWriteParam.setCompressionQuality(quality);
- imageWriteParam.setProgressiveMode(ImageWriteParam.MODE_DISABLED);
- }
- writer.write(null, new IIOImage(srcBuffer, null, null), imageWriteParam);
- BufferedImage read = ImageIO.read(tempFile);
- tempFile.delete();
- fileOutputStream.close();
- imageOutputStream.close();
- return read;
- } catch (Exception e) {
- e.printStackTrace();
- System.err.println("图片压缩失败");
- return null;
- }
- }
-
/**
* @author 韩建东
* 获得图片的BufferedImage 处理 图片 变红 的bug
@@ -222,33 +129,6 @@ public class ImageUtils {
return srcBuffer;
}
- /**
- * @author 韩建东
- * @param srcBuffer 图 流
- * @param x 裁剪 x坐标
- * @param y 裁剪 y 坐标
- * @param width 裁剪 宽度
- * @param height 裁剪 高度
- * @return BufferedImage
- */
- public static BufferedImage cut(BufferedImage srcBuffer,int x,int y,int width,int height) {
- int picheight = srcBuffer.getHeight();
- int picwidth = srcBuffer.getWidth();
- if(picheight < y+height || picwidth < x+width) {
- System.err.println("裁剪过高或者过宽");
- return null;
- }
-
- CropImageFilter cropImageFilter = new CropImageFilter(x, y, width, height);
- Image img = Toolkit.getDefaultToolkit().createImage(new FilteredImageSource(srcBuffer.getSource(),cropImageFilter));
- BufferedImage destBuffer = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
- Graphics2D g2d = destBuffer.createGraphics();
- //绘制切割后的图
- g2d.drawImage(img, 0, 0, width, height, null);
- g2d.dispose();
- return destBuffer;
- }
-
/**
* 将图片转为 base64 string
* @author 韩建东
@@ -324,14 +204,37 @@ public class ImageUtils {
return "data:image/jpeg;base64," + Base64Utils.encodeByte(bytes);
}
+ /**
+ * 图片路径转BufferedImage
+ * @author 陈霓清
+ * @param imageFilePath
+ * @return
+ * @throws IOException
+ */
+ public static BufferedImage read(String imageFilePath) throws IOException {
+ return ImageIO.read(new File(imageFilePath));
+ }
+
+ /**
+ * BufferedImage转图片路径
+ * @author 陈霓清
+ * @param bufferedImage
+ * @param imageFilePath : "D:\\test\\2.jpg"
+ * @param imageType : "JEPG"
+ * @throws IOException
+ */
+ public static void write(BufferedImage bufferedImage, String imageFilePath, String imageType) throws IOException {
+ ImageIO.write(bufferedImage, imageType, new File(imageFilePath));
+ }
+
/**
* 得到网页中图片的地址
* @author 陈霓清
* @param htmlStr
* @return
*/
- public static java.util.List listImages(String htmlStr) {
- java.util.List list = new ArrayList();
+ public static List listImages(String htmlStr) {
+ List list = new ArrayList();
Pattern p = Pattern.compile("<(img|IMG)(.*?)(>|>|/>)");
Matcher matcher = p.matcher(htmlStr);
boolean hasPic = matcher.find();
@@ -360,14 +263,113 @@ public class ImageUtils {
return list;
}
- public static void main(String[] args) throws IOException {
- BufferedImage bufferedImage = ImageIO.read(new File("D:\\test\\1.jpg"));
- String base64Str = toBase64Str(bufferedImage);
- System.err.println("base64Str:" + base64Str);
+ /**
+ * 图片压缩(自定义尺寸)
+ * @author 陈霓清
+ * @param srcBuffer 要缩放的图片
+ * @param width 目标宽度像素
+ * @param height 目标高度像素
+ */
+ public final static BufferedImage compress(BufferedImage srcBuffer, int width, int height) {
+ if (width < MIN_PIC_WIDTH) {
+ width = MIN_PIC_WIDTH;
+ }
+ if (height < MIN_PIC_HEIGHT) {
+ height = MIN_PIC_HEIGHT;
+ }
+
+ double ratio = 0.0; // 缩放比例
+ // bi.SCALE_SMOOTH 选择图像平滑度比缩放速度具有更高优先级的图像缩放算法
+ Image itemp = srcBuffer.getScaledInstance(width, height, Image.SCALE_DEFAULT);
+ // 计算比例
+ if ((srcBuffer.getHeight()>height) || (srcBuffer.getWidth()>width)) {
+ double ratioHeight = (new Integer(height)).doubleValue() / srcBuffer.getHeight();
+ double ratioWhidth = (new Integer(width)).doubleValue() / srcBuffer.getWidth();
+ if (ratioHeight > ratioWhidth) {
+ ratio = ratioHeight;
+ } else {
+ ratio = ratioWhidth;
+ }
+ // 仿射转换
+ // 返回表示剪切变换的变换
+ AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);
+ // 转换源 BufferedImage 并将结果存储在目标 BufferedImage 中
+ itemp = op.filter(srcBuffer, null);
+ }
-// String base64Str2 = toBase64Str("D:\\test\\1.jpg");
-// System.err.println("base64Str2:" + base64Str2);
+ // 补白
+ // 构造一个类型为预定义图像类型之一的 BufferedImage
+ BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ //创建一个 Graphics2D,可以将它绘制到此 BufferedImage 中
+ Graphics2D g = image.createGraphics();
+ g.setColor(Color.white); //控制颜色
+ g.fillRect(0, 0, width, height); // 使用 Graphics2D 上下文的设置,填充 Shape 的内部区域
+ if (width == itemp.getWidth(null)) {
+ g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2,
+ itemp.getWidth(null), itemp.getHeight(null),
+ Color.white, null);
+ } else {
+ g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,
+ itemp.getWidth(null), itemp.getHeight(null),
+ Color.white, null);
+ }
+ g.dispose();
+ itemp = image;
+ return (BufferedImage) itemp;
+ }
+
+ /**
+ * 图片压缩(等比例压缩)
+ * @author 陈霓清
+ * @param srcBuffer 要缩放的图片
+ * @param quality 压缩率(0~1之间)
+ */
+ public final static BufferedImage compress(BufferedImage srcBuffer, float quality) {
+ if (quality <= 0 || quality > 1) {
+ System.err.println("参数不合法");
+ return null;
+ }
+
+ int width = (int) (srcBuffer.getWidth() * quality);
+ int height = (int) (srcBuffer.getHeight() * quality);
+
+ return compress(srcBuffer, height, width);
+ }
+
+ /**
+ * 裁剪图片方法
+ * @author 陈霓清
+ * @param bufferedImage 图像源
+ * @param startX 裁剪开始x坐标
+ * @param startY 裁剪开始y坐标
+ * @param endX 裁剪结束x坐标
+ * @param endY 裁剪结束y坐标
+ * @return
+ */
+ public static BufferedImage cut(BufferedImage bufferedImage, int startX, int startY, int endX, int endY) {
+ int width = bufferedImage.getWidth();
+ int height = bufferedImage.getHeight();
+ if (startX == -1) {
+ startX = 0;
+ }
+ if (startY == -1) {
+ startY = 0;
+ }
+ if (endX == -1) {
+ endX = width - 1;
+ }
+ if (endY == -1) {
+ endY = height - 1;
+ }
+ BufferedImage result = new BufferedImage(endX-startX, endY-startY, 4);
+ for (int x=startX; x
Date: Wed, 4 Jan 2023 11:01:49 +0800
Subject: [PATCH 40/44] =?UTF-8?q?=E6=96=B0=E5=A2=9EHttpClient=E5=B7=A5?=
=?UTF-8?q?=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../javaex/htool/core/string/StringUtils.java | 18 +
htool-http/pom.xml | 16 +
.../java/cn/javaex/htool/http/HtmlUtils.java | 25 ++
.../java/cn/javaex/htool/http/HttpUtils.java | 311 ------------------
.../http/httpclient/HttpClientResult.java | 76 +++++
.../htool/http/httpclient/HttpUtils.java | 258 +++++++++++++++
.../httpclient/handler/HttpClientHandler.java | 199 +++++++++++
7 files changed, 592 insertions(+), 311 deletions(-)
delete mode 100644 htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java
create mode 100644 htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java
create mode 100644 htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java
create mode 100644 htool-http/src/main/java/cn/javaex/htool/http/httpclient/handler/HttpClientHandler.java
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java
index 023d158..9464954 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/string/StringUtils.java
@@ -660,4 +660,22 @@ public class StringUtils {
return str.substring(0, str.length() - 1);
}
+ /**
+ * 含unicode字符串转utf-8
+ * @param str
+ * @return
+ */
+ public static String unicodeToString(String str) {
+ Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
+ Matcher matcher = pattern.matcher(str);
+ char ch;
+ while (matcher.find()) {
+ String group = matcher.group(2);
+ ch = (char) Integer.parseInt(group, 16);
+ String group1 = matcher.group(1);
+ str = str.replace(group1, ch + "");
+ }
+ return str;
+ }
+
}
diff --git a/htool-http/pom.xml b/htool-http/pom.xml
index bac0e02..b64afac 100644
--- a/htool-http/pom.xml
+++ b/htool-http/pom.xml
@@ -17,6 +17,22 @@
provided
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.14
+
+
+
+ cn.javaex
+ htool-core
+ ${project.parent.version}
+
+
+ com.alibaba
+ fastjson
+ 1.2.62
+
eu.bitwalker
UserAgentUtils
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java
index c4a3df7..f5b9e6a 100644
--- a/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java
+++ b/htool-http/src/main/java/cn/javaex/htool/http/HtmlUtils.java
@@ -1,5 +1,30 @@
package cn.javaex.htool.http;
+/**
+ * html文本内容工具类
+ *
+ * @author 陈霓清
+ * @Date 2023年1月3日
+ */
public class HtmlUtils {
+ /**
+ * 过滤HTML文本,防止XSS攻击
+ *
+ * @param htmlContent HTML内容
+ * @return 过滤后的内容
+ */
+ public static String filter(String htmlContent) {
+ if (htmlContent==null || htmlContent.length()==0) {
+ return htmlContent;
+ }
+
+ // 删除普通标签
+ htmlContent = htmlContent.replaceAll("<(S*?)[^>]*>.*?|<.*? />", "");
+ // 删除转义字符
+ htmlContent = htmlContent.replaceAll("&.{2,6}?;", "");
+
+ return htmlContent;
+ }
+
}
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java
deleted file mode 100644
index a7c8e48..0000000
--- a/htool-http/src/main/java/cn/javaex/htool/http/HttpUtils.java
+++ /dev/null
@@ -1,311 +0,0 @@
-//package cn.javaex.htool.http;
-//
-//import java.io.UnsupportedEncodingException;
-//import java.net.URLEncoder;
-//import java.security.KeyManagementException;
-//import java.security.NoSuchAlgorithmException;
-//import java.security.cert.X509Certificate;
-//import java.util.ArrayList;
-//import java.util.List;
-//import java.util.Map;
-//
-//import javax.net.ssl.SSLContext;
-//import javax.net.ssl.TrustManager;
-//import javax.net.ssl.X509TrustManager;
-//
-//import org.apache.http.HttpResponse;
-//import org.apache.http.NameValuePair;
-//import org.apache.http.client.HttpClient;
-//import org.apache.http.client.entity.UrlEncodedFormEntity;
-//import org.apache.http.client.methods.HttpDelete;
-//import org.apache.http.client.methods.HttpGet;
-//import org.apache.http.client.methods.HttpPost;
-//import org.apache.http.client.methods.HttpPut;
-//import org.apache.http.conn.ClientConnectionManager;
-//import org.apache.http.conn.scheme.Scheme;
-//import org.apache.http.conn.scheme.SchemeRegistry;
-//import org.apache.http.conn.ssl.SSLSocketFactory;
-//import org.apache.http.entity.ByteArrayEntity;
-//import org.apache.http.entity.StringEntity;
-//import org.apache.http.impl.client.DefaultHttpClient;
-//import org.apache.http.message.BasicNameValuePair;
-//
-//public class HttpUtils {
-//
-// /**
-// * get
-// *
-// * @param host
-// * @param path
-// * @param method
-// * @param headers
-// * @param querys
-// * @return
-// * @throws Exception
-// */
-// public static HttpResponse doGet(String host, String path, String method,
-// Map headers,
-// Map querys)
-// throws Exception {
-// HttpClient httpClient = wrapClient(host);
-//
-// HttpGet request = new HttpGet(buildUrl(host, path, querys));
-// for (Map.Entry e : headers.entrySet()) {
-// request.addHeader(e.getKey(), e.getValue());
-// }
-//
-// return httpClient.execute(request);
-// }
-//
-// /**
-// * post form
-// *
-// * @param host
-// * @param path
-// * @param method
-// * @param headers
-// * @param querys
-// * @param bodys
-// * @return
-// * @throws Exception
-// */
-// public static HttpResponse doPost(String host, String path, String method,
-// Map headers,
-// Map querys,
-// Map bodys)
-// throws Exception {
-// HttpClient httpClient = wrapClient(host);
-//
-// HttpPost request = new HttpPost(buildUrl(host, path, querys));
-// for (Map.Entry e : headers.entrySet()) {
-// request.addHeader(e.getKey(), e.getValue());
-// }
-//
-// if (bodys != null) {
-// List nameValuePairList = new ArrayList();
-//
-// for (String key : bodys.keySet()) {
-// nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
-// }
-// UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
-// formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
-// request.setEntity(formEntity);
-// }
-//
-// return httpClient.execute(request);
-// }
-//
-// /**
-// * Post String
-// *
-// * @param host
-// * @param path
-// * @param method
-// * @param headers
-// * @param querys
-// * @param body
-// * @return
-// * @throws Exception
-// */
-// public static HttpResponse doPost(String host, String path, String method,
-// Map headers,
-// Map querys,
-// String body)
-// throws Exception {
-// HttpClient httpClient = wrapClient(host);
-//
-// HttpPost request = new HttpPost(buildUrl(host, path, querys));
-// for (Map.Entry e : headers.entrySet()) {
-// request.addHeader(e.getKey(), e.getValue());
-// }
-//
-// if (StringUtils.isNotBlank(body)) {
-// request.setEntity(new StringEntity(body, "utf-8"));
-// }
-//
-// return httpClient.execute(request);
-// }
-//
-// /**
-// * Post stream
-// *
-// * @param host
-// * @param path
-// * @param method
-// * @param headers
-// * @param querys
-// * @param body
-// * @return
-// * @throws Exception
-// */
-// public static HttpResponse doPost(String host, String path, String method,
-// Map headers,
-// Map querys,
-// byte[] body)
-// throws Exception {
-// HttpClient httpClient = wrapClient(host);
-//
-// HttpPost request = new HttpPost(buildUrl(host, path, querys));
-// for (Map.Entry e : headers.entrySet()) {
-// request.addHeader(e.getKey(), e.getValue());
-// }
-//
-// if (body != null) {
-// request.setEntity(new ByteArrayEntity(body));
-// }
-//
-// return httpClient.execute(request);
-// }
-//
-// /**
-// * Put String
-// * @param host
-// * @param path
-// * @param method
-// * @param headers
-// * @param querys
-// * @param body
-// * @return
-// * @throws Exception
-// */
-// public static HttpResponse doPut(String host, String path, String method,
-// Map headers,
-// Map querys,
-// String body)
-// throws Exception {
-// HttpClient httpClient = wrapClient(host);
-//
-// HttpPut request = new HttpPut(buildUrl(host, path, querys));
-// for (Map.Entry e : headers.entrySet()) {
-// request.addHeader(e.getKey(), e.getValue());
-// }
-//
-// if (StringUtils.isNotBlank(body)) {
-// request.setEntity(new StringEntity(body, "utf-8"));
-// }
-//
-// return httpClient.execute(request);
-// }
-//
-// /**
-// * Put stream
-// * @param host
-// * @param path
-// * @param method
-// * @param headers
-// * @param querys
-// * @param body
-// * @return
-// * @throws Exception
-// */
-// public static HttpResponse doPut(String host, String path, String method,
-// Map headers,
-// Map querys,
-// byte[] body)
-// throws Exception {
-// HttpClient httpClient = wrapClient(host);
-//
-// HttpPut request = new HttpPut(buildUrl(host, path, querys));
-// for (Map.Entry e : headers.entrySet()) {
-// request.addHeader(e.getKey(), e.getValue());
-// }
-//
-// if (body != null) {
-// request.setEntity(new ByteArrayEntity(body));
-// }
-//
-// return httpClient.execute(request);
-// }
-//
-// /**
-// * Delete
-// *
-// * @param host
-// * @param path
-// * @param method
-// * @param headers
-// * @param querys
-// * @return
-// * @throws Exception
-// */
-// public static HttpResponse doDelete(String host, String path, String method,
-// Map headers,
-// Map querys)
-// throws Exception {
-// HttpClient httpClient = wrapClient(host);
-//
-// HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
-// for (Map.Entry e : headers.entrySet()) {
-// request.addHeader(e.getKey(), e.getValue());
-// }
-//
-// return httpClient.execute(request);
-// }
-//
-// private static String buildUrl(String host, String path, Map querys) throws UnsupportedEncodingException {
-// StringBuilder sbUrl = new StringBuilder();
-// sbUrl.append(host);
-// if (!StringUtils.isBlank(path)) {
-// sbUrl.append(path);
-// }
-// if (null != querys) {
-// StringBuilder sbQuery = new StringBuilder();
-// for (Map.Entry query : querys.entrySet()) {
-// if (0 < sbQuery.length()) {
-// sbQuery.append("&");
-// }
-// if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
-// sbQuery.append(query.getValue());
-// }
-// if (!StringUtils.isBlank(query.getKey())) {
-// sbQuery.append(query.getKey());
-// if (!StringUtils.isBlank(query.getValue())) {
-// sbQuery.append("=");
-// sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
-// }
-// }
-// }
-// if (0 < sbQuery.length()) {
-// sbUrl.append("?").append(sbQuery);
-// }
-// }
-//
-// return sbUrl.toString();
-// }
-//
-// private static HttpClient wrapClient(String host) {
-// HttpClient httpClient = new DefaultHttpClient();
-// if (host.startsWith("https://")) {
-// sslClient(httpClient);
-// }
-//
-// return httpClient;
-// }
-//
-// private static void sslClient(HttpClient httpClient) {
-// try {
-// SSLContext ctx = SSLContext.getInstance("TLS");
-// X509TrustManager tm = new X509TrustManager() {
-// public X509Certificate[] getAcceptedIssuers() {
-// return null;
-// }
-// public void checkClientTrusted(X509Certificate[] xcs, String str) {
-//
-// }
-// public void checkServerTrusted(X509Certificate[] xcs, String str) {
-//
-// }
-// };
-// ctx.init(null, new TrustManager[] { tm }, null);
-// SSLSocketFactory ssf = new SSLSocketFactory(ctx);
-// ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
-// ClientConnectionManager ccm = httpClient.getConnectionManager();
-// SchemeRegistry registry = ccm.getSchemeRegistry();
-// registry.register(new Scheme("https", 443, ssf));
-// } catch (KeyManagementException ex) {
-// throw new RuntimeException(ex);
-// } catch (NoSuchAlgorithmException ex) {
-// throw new RuntimeException(ex);
-// }
-// }
-//}
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java
new file mode 100644
index 0000000..3038917
--- /dev/null
+++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java
@@ -0,0 +1,76 @@
+package cn.javaex.htool.http.httpclient;
+
+import java.io.Serializable;
+
+import org.apache.http.HttpEntity;
+
+/**
+ * http响应结果封装
+ *
+ * @author 陈霓清
+ * @Date 2023年1月3日
+ */
+public class HttpClientResult implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 响应状态码
+ */
+ private int code;
+ /**
+ * 响应数据
+ */
+ private HttpEntity entity;
+ /**
+ * 响应数据转byte[]
+ */
+ private byte[] body;
+ /**
+ * 响应数据转String
+ */
+ private String content;
+
+ public HttpClientResult(int scInternalServerError) {
+ this.code = scInternalServerError;
+ }
+
+ public HttpClientResult(int code, HttpEntity entity, byte[] body, String content) {
+ this.code = code;
+ this.entity = entity;
+ this.body = body;
+ this.content = content;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public HttpEntity getEntity() {
+ return entity;
+ }
+
+ public void setEntity(HttpEntity entity) {
+ this.entity = entity;
+ }
+
+ public byte[] getBody() {
+ return body;
+ }
+
+ public void setBody(byte[] body) {
+ this.body = body;
+ }
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+}
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java
new file mode 100644
index 0000000..34a4ca1
--- /dev/null
+++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java
@@ -0,0 +1,258 @@
+package cn.javaex.htool.http.httpclient;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.message.BasicNameValuePair;
+
+import com.alibaba.fastjson.JSON;
+
+import cn.javaex.htool.core.string.StringUtils;
+import cn.javaex.htool.http.httpclient.handler.HttpClientHandler;
+
+/**
+ * HttpClient工具类
+ *
+ * @author 陈霓清
+ * @Date 2023年1月4日
+ */
+public class HttpUtils {
+
+ public static void main(String[] args) throws Exception {
+ // http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E5%85%B3%E9%94%AE%E5%AD%97&bk_length=600
+// Map querys = new HashMap();
+// querys.put("scope", "103");
+// querys.put("format", "json");
+// querys.put("appid", "379020");
+// querys.put("bk_key", "梅西");
+// querys.put("bk_length", "600");
+//
+// HttpClientResult result = doGet("https://baike.baidu.com/api/openapi/BaikeLemmaCardApi", new HashMap(), querys);
+// System.out.println(result.getContent());
+
+
+ // 请求数据
+ String url="https://qajjmtsfe-api.jjmc.cn/token/create";
+ Map reqParam=new HashMap<>();
+ reqParam.put("key","e8e881e7-8202-ed11-bb3a-0017fa025f41");
+ HttpClientResult httpClientResult = HttpUtils.doPostWithJson(url, null, null, JSON.toJSONString(reqParam));
+ System.out.println(httpClientResult.getContent());
+
+ System.out.println("OK");
+ }
+
+ /**
+ * GET请求
+ * @param url
+ * @param headers
+ * @param querys
+ * @return
+ * @throws Exception
+ */
+ public static HttpClientResult doGet(String url, Map headers, Map querys) throws Exception {
+ HttpClientHandler httpClientHandler = new HttpClientHandler();
+
+ HttpClient httpClient = httpClientHandler.wrapClient(url);
+ HttpGet request = new HttpGet(httpClientHandler.buildUrl(url, querys));
+ // 封装请求头
+ httpClientHandler.packageHeader(request, headers);
+
+ HttpResponse httpResponse = httpClient.execute(request);
+ return httpClientHandler.getHttpClientResult(httpResponse);
+ }
+
+ /**
+ * POST请求
+ * @param url
+ * @param headers
+ * @param querys
+ * @param bodys
+ * @return
+ * @throws Exception
+ */
+ public static HttpClientResult doPost(String url, Map headers, Map querys, Map bodys) throws Exception {
+ HttpClientHandler httpClientHandler = new HttpClientHandler();
+
+ HttpClient httpClient = httpClientHandler.wrapClient(url);
+ HttpPost request = new HttpPost(httpClientHandler.buildUrl(url, querys));
+ // 封装请求头
+ httpClientHandler.packageHeader(request, headers);
+
+ if (bodys != null) {
+ List nameValuePairList = new ArrayList();
+
+ for (String key : bodys.keySet()) {
+ nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
+ }
+ UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "UTF-8");
+ formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
+ request.setEntity(formEntity);
+ }
+
+ HttpResponse httpResponse = httpClient.execute(request);
+ return httpClientHandler.getHttpClientResult(httpResponse);
+ }
+
+ /**
+ * POST请求
+ * @param url
+ * @param headers
+ * @param querys
+ * @param body
+ * @return
+ * @throws Exception
+ */
+ public static HttpClientResult doPost(String url, Map headers, Map querys, String body) throws Exception {
+ HttpClientHandler httpClientHandler = new HttpClientHandler();
+
+ HttpClient httpClient = httpClientHandler.wrapClient(url);
+ HttpPost request = new HttpPost(httpClientHandler.buildUrl(url, querys));
+ // 封装请求头
+ httpClientHandler.packageHeader(request, headers);
+
+ if (StringUtils.isNotBlank(body)) {
+ request.setEntity(new StringEntity(body, "UTF-8"));
+ }
+
+ HttpResponse httpResponse = httpClient.execute(request);
+ return httpClientHandler.getHttpClientResult(httpResponse);
+ }
+
+ /**
+ * POST请求
+ * @param url
+ * @param headers
+ * @param querys
+ * @param body
+ * @return
+ * @throws Exception
+ */
+ public static HttpClientResult doPost(String url, Map headers, Map querys, byte[] body) throws Exception {
+ HttpClientHandler httpClientHandler = new HttpClientHandler();
+
+ HttpClient httpClient = httpClientHandler.wrapClient(url);
+ HttpPost request = new HttpPost(httpClientHandler.buildUrl(url, querys));
+ // 封装请求头
+ httpClientHandler.packageHeader(request, headers);
+
+ if (body != null) {
+ request.setEntity(new ByteArrayEntity(body));
+ }
+
+ HttpResponse httpResponse = httpClient.execute(request);
+ return httpClientHandler.getHttpClientResult(httpResponse);
+ }
+
+ /**
+ * POST请求
+ * @param url
+ * @param headers
+ * @param querys
+ * @param body
+ * @return
+ * @throws Exception
+ */
+ public static HttpClientResult doPostWithJson(String url, Map headers, Map querys, String body) throws Exception {
+ HttpClientHandler httpClientHandler = new HttpClientHandler();
+
+ HttpClient httpClient = httpClientHandler.wrapClient(url);
+ HttpPost request = new HttpPost(httpClientHandler.buildUrl(url, querys));
+ // 封装请求头
+ Map reqHeaders = new HashMap<>();
+ reqHeaders.put("Content-type", "application/json");
+ if (headers != null) {
+ reqHeaders.putAll(headers);
+ }
+ httpClientHandler.packageHeader(request, reqHeaders);
+
+ if (StringUtils.isNotBlank(body)) {
+ request.setEntity(new StringEntity(body, "UTF-8"));
+ }
+
+ HttpResponse httpResponse = httpClient.execute(request);
+ return httpClientHandler.getHttpClientResult(httpResponse);
+ }
+
+ /**
+ * PUT请求
+ * @param url
+ * @param headers
+ * @param querys
+ * @param body
+ * @return
+ * @throws Exception
+ */
+ public static HttpClientResult doPut(String url, Map headers, Map querys, String body) throws Exception {
+ HttpClientHandler httpClientHandler = new HttpClientHandler();
+
+ HttpClient httpClient = httpClientHandler.wrapClient(url);
+ HttpPut request = new HttpPut(httpClientHandler.buildUrl(url, querys));
+ // 封装请求头
+ httpClientHandler.packageHeader(request, headers);
+
+ if (StringUtils.isNotBlank(body)) {
+ request.setEntity(new StringEntity(body, "UTF-8"));
+ }
+
+ HttpResponse httpResponse = httpClient.execute(request);
+ return httpClientHandler.getHttpClientResult(httpResponse);
+ }
+
+ /**
+ * PUT请求
+ * @param url
+ * @param headers
+ * @param querys
+ * @param body
+ * @return
+ * @throws Exception
+ */
+ public static HttpClientResult doPut(String url, Map headers, Map querys, byte[] body) throws Exception {
+ HttpClientHandler httpClientHandler = new HttpClientHandler();
+
+ HttpClient httpClient = httpClientHandler.wrapClient(url);
+ HttpPut request = new HttpPut(httpClientHandler.buildUrl(url, querys));
+ // 封装请求头
+ httpClientHandler.packageHeader(request, headers);
+
+ if (body != null) {
+ request.setEntity(new ByteArrayEntity(body));
+ }
+
+ HttpResponse httpResponse = httpClient.execute(request);
+ return httpClientHandler.getHttpClientResult(httpResponse);
+ }
+
+ /**
+ * DELETE请求
+ * @param url
+ * @param headers
+ * @param querys
+ * @return
+ * @throws Exception
+ */
+ public static HttpClientResult doDelete(String url, Map headers, Map querys) throws Exception {
+ HttpClientHandler httpClientHandler = new HttpClientHandler();
+
+ HttpClient httpClient = httpClientHandler.wrapClient(url);
+ HttpDelete request = new HttpDelete(httpClientHandler.buildUrl(url, querys));
+ // 封装请求头
+ httpClientHandler.packageHeader(request, headers);
+
+ HttpResponse httpResponse = httpClient.execute(request);
+ return httpClientHandler.getHttpClientResult(httpResponse);
+ }
+
+}
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/handler/HttpClientHandler.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/handler/HttpClientHandler.java
new file mode 100644
index 0000000..867a280
--- /dev/null
+++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/handler/HttpClientHandler.java
@@ -0,0 +1,199 @@
+package cn.javaex.htool.http.httpclient.handler;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.X509Certificate;
+import java.util.Map;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpDelete;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.util.EntityUtils;
+
+import cn.javaex.htool.core.string.StringUtils;
+import cn.javaex.htool.http.httpclient.HttpClientResult;
+
+/**
+ * HttpClient公共方法
+ *
+ * @author 陈霓清
+ * @Date 2023年1月4日
+ */
+public class HttpClientHandler {
+
+ /**
+ * 构造HttpClient
+ * @param host
+ * @return
+ * @throws Exception
+ */
+ public HttpClient wrapClient(String host) throws Exception {
+ HttpClient httpClient = new DefaultHttpClient();
+ if (host.startsWith("https://")) {
+ this.sslClient(httpClient);
+ }
+
+ return httpClient;
+ }
+
+ /**
+ * SSL
+ * @param httpClient
+ */
+ @SuppressWarnings("deprecation")
+ private void sslClient(HttpClient httpClient) {
+ try {
+ SSLContext ctx = SSLContext.getInstance("TLS");
+ X509TrustManager tm = new X509TrustManager() {
+ public X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+ public void checkClientTrusted(X509Certificate[] xcs, String str) {
+
+ }
+ public void checkServerTrusted(X509Certificate[] xcs, String str) {
+
+ }
+ };
+ ctx.init(null, new TrustManager[] { tm }, null);
+ SSLSocketFactory ssf = new SSLSocketFactory(ctx);
+ ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+ ClientConnectionManager ccm = httpClient.getConnectionManager();
+ SchemeRegistry registry = ccm.getSchemeRegistry();
+ registry.register(new Scheme("https", 443, ssf));
+ } catch (KeyManagementException ex) {
+ throw new RuntimeException(ex);
+ } catch (NoSuchAlgorithmException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ /**
+ * 拼接URL
+ * @param url
+ * @param querys 查询参数
+ * @return
+ * @throws UnsupportedEncodingException
+ */
+ public String buildUrl(String url, Map querys) throws UnsupportedEncodingException {
+ StringBuffer sbUrl = new StringBuffer();
+ sbUrl.append(url);
+
+ if (querys != null) {
+ StringBuffer sbQuery = new StringBuffer();
+ for (Map.Entry query : querys.entrySet()) {
+ if (0 < sbQuery.length()) {
+ sbQuery.append("&");
+ }
+ if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
+ sbQuery.append(query.getValue());
+ }
+ if (!StringUtils.isBlank(query.getKey())) {
+ sbQuery.append(query.getKey());
+ if (!StringUtils.isBlank(query.getValue())) {
+ sbQuery.append("=");
+ sbQuery.append(URLEncoder.encode(query.getValue(), "UTF-8"));
+ }
+ }
+ }
+ if (0 < sbQuery.length()) {
+ sbUrl.append("?").append(sbQuery);
+ }
+ }
+
+ return sbUrl.toString();
+ }
+
+ /**
+ * 封装请求头
+ * @param request
+ * @param headers
+ */
+ public void packageHeader(HttpGet request, Map headers) {
+ if (headers != null) {
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ }
+ }
+
+ /**
+ * 封装请求头
+ * @param request
+ * @param headers
+ */
+ public void packageHeader(HttpPost request, Map headers) {
+ if (headers != null) {
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ }
+ }
+
+ /**
+ * 封装请求头
+ * @param request
+ * @param headers
+ */
+ public void packageHeader(HttpPut request, Map headers) {
+ if (headers != null) {
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ }
+ }
+
+ /**
+ * 封装请求头
+ * @param request
+ * @param headers
+ */
+ public void packageHeader(HttpDelete request, Map headers) {
+ if (headers != null) {
+ for (Map.Entry e : headers.entrySet()) {
+ request.addHeader(e.getKey(), e.getValue());
+ }
+ }
+ }
+
+ /**
+ * 获取返回结果
+ * @param httpResponse
+ * @return
+ * @throws IOException
+ */
+ public HttpClientResult getHttpClientResult(HttpResponse httpResponse) throws IOException {
+ if (httpResponse != null && httpResponse.getStatusLine() != null) {
+ byte[] body = null;
+ String content = "";
+
+ if (httpResponse.getEntity() != null) {
+ body = EntityUtils.toByteArray(httpResponse.getEntity());
+
+ content = new String(body, "UTF-8");
+ content = StringUtils.unicodeToString(content);
+ }
+
+ return new HttpClientResult(httpResponse.getStatusLine().getStatusCode(), httpResponse.getEntity(), body, content);
+ }
+
+ return new HttpClientResult(HttpStatus.SC_INTERNAL_SERVER_ERROR);
+ }
+
+}
--
Gitee
From 64d39bf3b202bffcfadcf519a7f1047b4bb8fdbe Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Wed, 4 Jan 2023 11:53:44 +0800
Subject: [PATCH 41/44] 20230104
---
.../cn/javaex/htool/core/io/FileUtils.java | 138 +++++++++---------
.../htool/core/io/handler/PathHandler.java | 73 ---------
.../http/httpclient/HttpClientResult.java | 21 +--
.../htool/http/httpclient/HttpUtils.java | 25 ----
4 files changed, 77 insertions(+), 180 deletions(-)
delete mode 100644 htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
index 0cdbc98..4b4753c 100644
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
+++ b/htool-core/src/main/java/cn/javaex/htool/core/io/FileUtils.java
@@ -16,13 +16,11 @@ import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
-import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.javaex.htool.core.io.handler.FileHandler;
import cn.javaex.htool.core.io.handler.FileHelper;
import cn.javaex.htool.core.io.handler.FilenameHandler;
-import cn.javaex.htool.core.io.handler.PathHandler;
import cn.javaex.htool.core.io.model.TreeFile;
import cn.javaex.htool.core.string.StringUtils;
@@ -512,35 +510,35 @@ public class FileUtils extends FileHelper {
/**
* 下载resources文件夹下的文件
- * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx
- * @param newFileName 重命名文件名称(带后缀)
+ * @param filePath resources文件夹下的路径,例如:template/excel/模板.xlsx
+ * @param newFilename 重命名文件名称(带后缀)
*/
- public static void downloadFileFromResource(HttpServletResponse response, String filePath, String newFileName) {
- if (newFileName==null || newFileName.length()==0) {
- newFileName = filePath.substring(filePath.lastIndexOf("/") + 1, filePath.length());
+ public static void downloadFileFromResource(HttpServletResponse response, String filePath, String newFilename) {
+ if (filePath.startsWith("/")) {
+ filePath = filePath.substring(1);
}
- InputStream inputStream = PathHandler.getInputStreamFromResource(filePath);
- downloadFile(response, inputStream, newFileName);
+ InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(filePath);
+ downloadFile(response, inputStream, newFilename);
}
/**
* 下载文件(InputStream流)
- * @param in InputStream流
- * @param newFileName 重命名文件名称(带后缀)
+ * @param inputStream
+ * @param newFilename 重命名文件名称(带后缀)
*/
- public static void downloadFile(HttpServletResponse response, InputStream in, String newFileName) {
+ public static void downloadFile(HttpServletResponse response, InputStream inputStream, String newFilename) {
OutputStream out = null;
try {
+ newFilename = java.net.URLEncoder.encode(newFilename, "UTF-8");
response.setContentType("application/octet-stream");
- newFileName = java.net.URLEncoder.encode(newFileName, "UTF-8");
- response.setHeader("Content-disposition", "attachment; filename=" + newFileName);
+ response.setHeader("Content-disposition", "attachment; filename=" + newFilename);
out = response.getOutputStream();
int b = 0;
byte[] buffer = new byte[BUFFER_SIZE];
- while ((b = in.read(buffer)) != -1) {
+ while ((b = inputStream.read(buffer)) != -1) {
out.write(buffer, 0, b);
}
@@ -549,42 +547,46 @@ public class FileUtils extends FileHelper {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(out);
- IOUtils.closeQuietly(in);
+ IOUtils.closeQuietly(inputStream);
}
}
+ /**
+ * 下载文件(byte[]字节数组)
+ * @param bytes
+ * @param newFilename 重命名文件名称(带后缀)
+ */
+ public static void downloadFile(HttpServletResponse response, byte[] bytes, String newFilename) {
+ try (OutputStream out = response.getOutputStream()) {
+ if (bytes != null) {
+ newFilename = java.net.URLEncoder.encode(newFilename, "UTF-8");
+ response.setContentType("application/octet-stream");
+ response.setHeader("Content-disposition", "attachment; filename=" + newFilename);
+ out.write(bytes);
+ out.flush();
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
/**
* 下载文件(不重命名)
- * @param filePath 文件的路径(带具体的文件名)
- * 如果是相对路径,则认为是项目的同级目录
- * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径
+ * @param filePath 文件的绝对路径(带具体的文件名)
*/
- public static void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath) {
- downloadFile(request, response, filePath, null);
+ public static void downloadFile(HttpServletResponse response, String filePath) {
+ downloadFile(response, filePath, null);
}
/**
* 下载文件(重命名)
- * @param filePath 文件的路径(带具体的文件名)
- * 如果是相对路径,则认为是项目的同级目录
- * 如果是springboot源码运行,则认为相对路径是项目名文件夹下的路径
- * @param newFileName 重命名文件名称(带后缀)
- */
- public static void downloadFile(HttpServletRequest request, HttpServletResponse response, String filePath, String newFileName) {
- // 传入的路径是否是绝对路径
- boolean isAbsolutePath = PathHandler.isAbsolutePath(filePath);
- // 存储文件的物理路径
- String fileAbsolutePath = "";
- if (isAbsolutePath) {
- fileAbsolutePath = filePath;
- } else {
- String projectPath = PathHandler.getProjectPath(request);
- fileAbsolutePath = projectPath + File.separator + filePath;
- }
-
- File file = new File(fileAbsolutePath);
- if (newFileName==null || newFileName.length()==0) {
- newFileName = file.getName();
+ * @param filePath 文件的绝对路径(带具体的文件名)
+ * @param newFilename 重命名文件名称(带后缀)
+ */
+ public static void downloadFile(HttpServletResponse response, String filePath, String newFilename) {
+ File file = new File(filePath);
+ if (StringUtils.isEmpty(newFilename)) {
+ newFilename = file.getName();
}
BufferedInputStream bis = null;
@@ -592,7 +594,7 @@ public class FileUtils extends FileHelper {
try {
response.setContentType("application/octet-stream");
- response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(newFileName, "UTF-8"));
+ response.setHeader("Content-disposition", "attachment; filename=" + URLEncoder.encode(newFilename, "UTF-8"));
response.setHeader("Content-Length", String.valueOf(file.length()));
bis = new BufferedInputStream(new FileInputStream(file));
@@ -623,44 +625,44 @@ public class FileUtils extends FileHelper {
* a/b.txt/c --> ""
* a/b/c --> ""
*
- * @param fileName
+ * @param filename
* @return
*/
- public static String getExtension(String fileName) {
- if (StringUtils.isEmpty(fileName)) {
- return fileName;
+ public static String getExtension(String filename) {
+ if (StringUtils.isEmpty(filename)) {
+ return filename;
}
// 如果是Linux下的特殊文件后缀,则直接返回
for (String specialExtension : SPECIAL_EXTENSION) {
- if (fileName.endsWith(EXTENSION_SEPARATOR_STR + specialExtension)) {
+ if (filename.endsWith(EXTENSION_SEPARATOR_STR + specialExtension)) {
return specialExtension;
}
}
- int index = FilenameHandler.indexOfExtension(fileName);
+ int index = FilenameHandler.indexOfExtension(filename);
if (index == NOT_FOUND) {
return EMPTY_STRING;
}
- return fileName.substring(index + 1);
+ return filename.substring(index + 1);
}
/**
* 获取文件的名称,不包括文件后缀和文件路径
*
* a/b/c.txt --> c
- * a.txt --> a
- * a/b/c --> c
- * a/b/c/ --> ""
+ * a.txt --> a
+ * a/b/c --> c
+ * a/b/c/ --> ""
*
- * @param fileName
+ * @param filename
* @return
*/
- public static String getBaseName(String fileName) {
- fileName = FilenameHandler.getName(fileName);
- String extension = getExtension(fileName);
+ public static String getBaseName(String filename) {
+ filename = FilenameHandler.getName(filename);
+ String extension = getExtension(filename);
- return fileName.replace(EXTENSION_SEPARATOR_STR + extension, "");
+ return filename.replace(EXTENSION_SEPARATOR_STR + extension, "");
}
/**
@@ -671,16 +673,16 @@ public class FileUtils extends FileHelper {
* a/b/c --> c
* a/b/c/ --> ""
*
- * @param fileName
+ * @param filename
* @return
*/
- public static String getName(String fileName) {
- if (StringUtils.isEmpty(fileName)) {
- return fileName;
+ public static String getName(String filename) {
+ if (StringUtils.isEmpty(filename)) {
+ return filename;
}
- int index = FilenameHandler.indexOfLastSeparator(fileName);
- return fileName.substring(index + 1);
+ int index = FilenameHandler.indexOfLastSeparator(filename);
+ return filename.substring(index + 1);
}
/**
@@ -692,13 +694,13 @@ public class FileUtils extends FileHelper {
* a/b/c --> a/b/
*
*
- * @param fileName
+ * @param filename
* @return
*/
- public static String getFullPath(String fileName) {
- String name = getName(fileName);
- int indexOf = fileName.indexOf(name);
- return fileName.substring(0, indexOf);
+ public static String getFullPath(String filename) {
+ String name = getName(filename);
+ int indexOf = filename.indexOf(name);
+ return filename.substring(0, indexOf);
}
}
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java b/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java
deleted file mode 100644
index bc9cc35..0000000
--- a/htool-core/src/main/java/cn/javaex/htool/core/io/handler/PathHandler.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package cn.javaex.htool.core.io.handler;
-
-import java.io.File;
-import java.io.InputStream;
-
-import javax.servlet.http.HttpServletRequest;
-
-/***
- * 路径工具类
- *
- * @author 陈霓清
- * @Date 2022年12月1日
- */
-public class PathHandler {
-
- /**
- * 判断是否是绝对路径
- * @param path
- * @return
- */
- public static boolean isAbsolutePath(String path) {
- path = path.substring(0, 2);
- return path.startsWith("/") || path.endsWith(":");
- }
-
- /**
- * 获取项目所在磁盘的文件夹路径,并设置临时目录
- * @param request
- * @return
- */
- public static String getFolderPath(HttpServletRequest request) {
- String projectPath = getProjectPath(request);
- String folderPath = projectPath + File.separator + "temp_download";
- File file = new File(folderPath);
- file.mkdirs();
-
- return folderPath;
- }
-
- /**
- * 获取项目所在磁盘的文件夹路径
- * @return
- */
- public static String getProjectPath(HttpServletRequest request) {
- try {
- // 获取地址内容,原路径(项目名)
- String realPath = request.getSession().getServletContext().getRealPath("/");
- // tomcat webapps下部署
- if (realPath!=null && realPath.length()>0 && realPath.contains("apache-tomcat")) {
- String path = request.getContextPath(); // 项目名
- path = path.replace("/", File.separator) + File.separator;
- return realPath.replace(path, "");
- }
-
- return System.getProperty("user.dir");
- } catch (Exception e) {
- return System.getProperty("user.dir");
- }
- }
-
- /**
- * 根据resources下的文件路径获取流
- * @param path 例如:template/excel/模板.xlsx
- * @return
- */
- public static InputStream getInputStreamFromResource(String path) {
- if (path.startsWith("/")) {
- path = path.substring(1);
- }
-
- return Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
- }
-}
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java
index 3038917..126e427 100644
--- a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java
+++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java
@@ -24,7 +24,7 @@ public class HttpClientResult implements Serializable {
/**
* 响应数据转byte[]
*/
- private byte[] body;
+ private byte[] bytes;
/**
* 响应数据转String
*/
@@ -34,41 +34,34 @@ public class HttpClientResult implements Serializable {
this.code = scInternalServerError;
}
- public HttpClientResult(int code, HttpEntity entity, byte[] body, String content) {
+ public HttpClientResult(int code, HttpEntity entity, byte[] bytes, String content) {
this.code = code;
this.entity = entity;
- this.body = body;
+ this.bytes = bytes;
this.content = content;
}
public int getCode() {
return code;
}
-
public void setCode(int code) {
this.code = code;
}
-
public HttpEntity getEntity() {
return entity;
}
-
public void setEntity(HttpEntity entity) {
this.entity = entity;
}
-
- public byte[] getBody() {
- return body;
+ public byte[] getBytes() {
+ return bytes;
}
-
- public void setBody(byte[] body) {
- this.body = body;
+ public void setBytes(byte[] bytes) {
+ this.bytes = bytes;
}
-
public String getContent() {
return content;
}
-
public void setContent(String content) {
this.content = content;
}
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java
index 34a4ca1..cbc361e 100644
--- a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java
+++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpUtils.java
@@ -17,8 +17,6 @@ import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.message.BasicNameValuePair;
-import com.alibaba.fastjson.JSON;
-
import cn.javaex.htool.core.string.StringUtils;
import cn.javaex.htool.http.httpclient.handler.HttpClientHandler;
@@ -30,29 +28,6 @@ import cn.javaex.htool.http.httpclient.handler.HttpClientHandler;
*/
public class HttpUtils {
- public static void main(String[] args) throws Exception {
- // http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=%E5%85%B3%E9%94%AE%E5%AD%97&bk_length=600
-// Map querys = new HashMap();
-// querys.put("scope", "103");
-// querys.put("format", "json");
-// querys.put("appid", "379020");
-// querys.put("bk_key", "梅西");
-// querys.put("bk_length", "600");
-//
-// HttpClientResult result = doGet("https://baike.baidu.com/api/openapi/BaikeLemmaCardApi", new HashMap(), querys);
-// System.out.println(result.getContent());
-
-
- // 请求数据
- String url="https://qajjmtsfe-api.jjmc.cn/token/create";
- Map reqParam=new HashMap<>();
- reqParam.put("key","e8e881e7-8202-ed11-bb3a-0017fa025f41");
- HttpClientResult httpClientResult = HttpUtils.doPostWithJson(url, null, null, JSON.toJSONString(reqParam));
- System.out.println(httpClientResult.getContent());
-
- System.out.println("OK");
- }
-
/**
* GET请求
* @param url
--
Gitee
From bb482ba440424ceeb2a8c5ad12b6f37597a12bcc Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Wed, 4 Jan 2023 13:07:55 +0800
Subject: [PATCH 42/44] 20230104
---
.../core/collection/CollectionUtils.java | 19 -------------------
1 file changed, 19 deletions(-)
delete mode 100644 htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java
diff --git a/htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java b/htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java
deleted file mode 100644
index 4a54a9b..0000000
--- a/htool-core/src/main/java/cn/javaex/htool/core/collection/CollectionUtils.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package cn.javaex.htool.core.collection;
-
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 集合操作工具类
- *
- * @author 陈霓清
- * @Date 2022年12月5日
- */
-public class CollectionUtils {
-
-
-}
--
Gitee
From 24fcade0d9086ead17ac14e6de7b7c9db42cb7c9 Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Wed, 4 Jan 2023 13:34:30 +0800
Subject: [PATCH 43/44] 20230104
---
.../htool/http/httpclient/HttpClientResult.java | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java
index 126e427..fd0bbc3 100644
--- a/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java
+++ b/htool-http/src/main/java/cn/javaex/htool/http/httpclient/HttpClientResult.java
@@ -24,7 +24,7 @@ public class HttpClientResult implements Serializable {
/**
* 响应数据转byte[]
*/
- private byte[] bytes;
+ private byte[] body;
/**
* 响应数据转String
*/
@@ -34,10 +34,10 @@ public class HttpClientResult implements Serializable {
this.code = scInternalServerError;
}
- public HttpClientResult(int code, HttpEntity entity, byte[] bytes, String content) {
+ public HttpClientResult(int code, HttpEntity entity, byte[] body, String content) {
this.code = code;
this.entity = entity;
- this.bytes = bytes;
+ this.body = body;
this.content = content;
}
@@ -53,11 +53,11 @@ public class HttpClientResult implements Serializable {
public void setEntity(HttpEntity entity) {
this.entity = entity;
}
- public byte[] getBytes() {
- return bytes;
+ public byte[] getBody() {
+ return body;
}
- public void setBytes(byte[] bytes) {
- this.bytes = bytes;
+ public void setBody(byte[] body) {
+ this.body = body;
}
public String getContent() {
return content;
--
Gitee
From d43901ee8be0355496bbd361854102c31fe9d940 Mon Sep 17 00:00:00 2001
From: "291026192@qq.com" <291026192@qq.com>
Date: Wed, 4 Jan 2023 14:22:52 +0800
Subject: [PATCH 44/44] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=9B=BE=E7=89=87?=
=?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cn/javaex/htool/picture/ImageUtils.java | 192 ++++++++----------
.../picture/util/BufferedImageBuilder.java | 59 ------
2 files changed, 89 insertions(+), 162 deletions(-)
delete mode 100644 htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java
diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java
index 1029ed0..7585d28 100644
--- a/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java
+++ b/htool-picture/src/main/java/cn/javaex/htool/picture/ImageUtils.java
@@ -5,15 +5,12 @@ import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
-import java.awt.RenderingHints;
import java.awt.Shape;
-import java.awt.Toolkit;
import java.awt.font.FontRenderContext;
import java.awt.font.TextLayout;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
@@ -28,10 +25,12 @@ import java.util.regex.Pattern;
import javax.imageio.ImageIO;
import cn.javaex.htool.core.codec.Base64Utils;
-import cn.javaex.htool.picture.util.BufferedImageBuilder;
/**
- * @author 韩建东 2022年11月27日
+ * 图片工具类
+ *
+ * @author 陈霓清
+ * @Date 2023年1月4日
*/
public class ImageUtils {
/**
@@ -50,15 +49,11 @@ public class ImageUtils {
/**
* 每个水印水平间隔
*/
- private static final int X_PADDING = 20;
+ private static final int X_PADDING = 150;
/**
* 每个水印垂直间隔
*/
- private static final int Y_PADDING = 70;
- /**
- * 水印字体大小
- */
- private static final int FONT_SIZE = 50;
+ private static final int Y_PADDING = 200;
/**
* 数值 2
@@ -66,105 +61,103 @@ public class ImageUtils {
private static final int NUM_TWO = 2;
/**
- * @author 韩建东
- * 获得图片的BufferedImage 处理 图片 变红 的bug
- *
- * @param file 图片路径
- * @return BufferedImage
- */
- public static BufferedImage getSrcBufferedImage(File file) {
- Image src = Toolkit.getDefaultToolkit().getImage(file.getPath());
- return BufferedImageBuilder.toBufferedImage(src);
- }
-
- /**
- * @author 韩建东
- * @param srcBuffer 图片流
- * @param text 水印文字
- * @param color 水印颜色
- * @return BufferedImage
+ * 添加水印(水印在右下角)
+ * @param srcBuffer
+ * @param text 水印内容,例如 https://www.javaex.cn
+ * @param font 水印字体,例如 Font font = new Font("宋体", Font.BOLD, 26);
+ * @param color 水印颜色,为null时,显示白色水印
+ * @return
*/
- public static BufferedImage addWaterMark(BufferedImage srcBuffer,String text,Color color){
- int width = srcBuffer.getWidth();
- int height = srcBuffer.getHeight();
-
- Graphics2D g = srcBuffer.createGraphics();
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- float alpha = 1F;
- AlphaComposite ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
- g.setComposite(ac);
- g.drawImage(srcBuffer, 0, 0, width, height, null);
- g.setBackground(Color.BLACK);
- Font oldfont = g.getFont();
- Font font = new Font( oldfont.getFamily(), Font.BOLD, FONT_SIZE);
- g.setFont(font);
- FontRenderContext frc = g.getFontRenderContext();
- TextLayout tl = new TextLayout(text, font, frc);
- //水印串宽度
- int stringWidth = g.getFontMetrics(g.getFont()).charsWidth(text.toCharArray(), 0, text.length());
-
- //旋转水印
- g.rotate(Math.toRadians(PIC_ANGEL), (double) width / NUM_TWO, (double) height / NUM_TWO);
- //水印透明度
- g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5F));
- // 字体色
- g.setColor(color);
-
- int x = -height / NUM_TWO;
- int y;
-
- //循环绘制
- while (x < width + height / NUM_TWO) {
- y = -width / NUM_TWO;
- while (y < height + width / NUM_TWO) {
- Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(x, y));
- g.fill(sha);
-
- y += Y_PADDING;
+ public static BufferedImage addWatermark(BufferedImage srcBuffer, String text, Font font, Color color) {
+ try {
+ int srcImgWidth = srcBuffer.getWidth();
+ int srcImgHeight = srcBuffer.getHeight();
+ BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g = bufImg.createGraphics();
+ g.drawImage(srcBuffer, 0, 0, srcImgWidth, srcImgHeight, null);
+ if (color==null) {
+ g.setColor(Color.WHITE);
+ } else {
+ g.setColor(color);
}
- x += stringWidth + X_PADDING;
+ g.setFont(font);
+
+ // 水印串宽度
+ int stringWidth = g.getFontMetrics(g.getFont()).charsWidth(text.toCharArray(), 0, text.length());
+ // 水印透明度
+ g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
+ // 设置水印的坐标
+ int x = srcImgWidth - stringWidth - 20;
+ int y = srcImgHeight - 20;
+ // 从坐标x,y开始添加水印
+ g.drawString(text, x, y);
+ // 释放资源
+ g.dispose();
+
+ return bufImg;
+ } catch (Exception e) {
+ e.printStackTrace();
}
- //释放资源
- g.dispose();
+
return srcBuffer;
}
/**
- * 将图片转为 base64 string
- * @author 韩建东
+ * 添加水印(铺满)
* @param srcBuffer
- * @return String
+ * @param text 水印内容,例如 https://www.javaex.cn
+ * @param font 水印字体,例如 Font font = new Font("宋体", Font.BOLD, 26);
+ * @param color 水印颜色,为null时,显示白色水印
+ * @return
*/
- public static String toBase64Str(BufferedImage srcBuffer) {
- String base64Str = "";
-
+ public static BufferedImage addWatermarks(BufferedImage srcBuffer, String text, Font font, Color color) {
try {
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- ImageIO.write(srcBuffer, "jpg", os);
- byte[] bytes = os.toByteArray();
- return "data:image/jpeg;base64," + Base64Utils.encodeByte(bytes);
- } catch (IOException e) {
- System.err.printf("转换base64错误");
+ int srcImgWidth = srcBuffer.getWidth();
+ int srcImgHeight = srcBuffer.getHeight();
+ BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g = bufImg.createGraphics();
+ g.drawImage(srcBuffer, 0, 0, srcImgWidth, srcImgHeight, null);
+ if (color==null) {
+ g.setColor(Color.WHITE);
+ } else {
+ g.setColor(color);
+ }
+ g.setFont(font);
+ FontRenderContext frc = g.getFontRenderContext();
+ TextLayout tl = new TextLayout(text, font, frc);
+ // 水印串宽度
+ int stringWidth = g.getFontMetrics(g.getFont()).charsWidth(text.toCharArray(), 0, text.length());
+ // 旋转水印
+ g.rotate(Math.toRadians(PIC_ANGEL), (double) srcImgWidth / NUM_TWO, (double) srcImgHeight / NUM_TWO);
+ // 水印透明度
+ g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));
+ // 设置水印的坐标
+ int x = -srcImgHeight / NUM_TWO;
+ int y;
+ // 循环绘制
+ while (x < srcImgWidth + srcImgHeight / NUM_TWO) {
+ y = -srcImgWidth / NUM_TWO;
+ while (y < srcImgHeight + srcImgWidth / NUM_TWO) {
+ Shape sha = tl.getOutline(AffineTransform.getTranslateInstance(x, y));
+ g.fill(sha);
+
+ y += Y_PADDING;
+ }
+ x += stringWidth + X_PADDING;
+ }
+ // 释放资源
+ g.dispose();
+
+ return bufImg;
+ } catch (Exception e) {
+ e.printStackTrace();
}
- return base64Str;
- }
-
- /**
- * RGB转换成16进制
- *
- * @param r R
- * @param g G
- * @param b B
- * @return String
- */
- public static String rgb2Hex(int r, int g, int b) {
- return String.format("#%02X%02X%02X", r, g, b);
+ return srcBuffer;
}
- /**
+ /**
* base64转url
- * @author 陈霓清
* @param base64Image
* @param imageFilePath : "D:\\test\\1.jpg"
* @return
@@ -186,7 +179,6 @@ public class ImageUtils {
/**
* 根据图片地址转换为base64编码字符串
- * @author 陈霓清
* @param imageFilePath : "D:\\test\\1.jpg"
* @return
*/
@@ -206,7 +198,6 @@ public class ImageUtils {
/**
* 图片路径转BufferedImage
- * @author 陈霓清
* @param imageFilePath
* @return
* @throws IOException
@@ -217,10 +208,9 @@ public class ImageUtils {
/**
* BufferedImage转图片路径
- * @author 陈霓清
* @param bufferedImage
* @param imageFilePath : "D:\\test\\2.jpg"
- * @param imageType : "JEPG"
+ * @param imageType : "jpg"
* @throws IOException
*/
public static void write(BufferedImage bufferedImage, String imageFilePath, String imageType) throws IOException {
@@ -229,7 +219,6 @@ public class ImageUtils {
/**
* 得到网页中图片的地址
- * @author 陈霓清
* @param htmlStr
* @return
*/
@@ -265,7 +254,6 @@ public class ImageUtils {
/**
* 图片压缩(自定义尺寸)
- * @author 陈霓清
* @param srcBuffer 要缩放的图片
* @param width 目标宽度像素
* @param height 目标高度像素
@@ -321,7 +309,6 @@ public class ImageUtils {
/**
* 图片压缩(等比例压缩)
- * @author 陈霓清
* @param srcBuffer 要缩放的图片
* @param quality 压缩率(0~1之间)
*/
@@ -339,7 +326,6 @@ public class ImageUtils {
/**
* 裁剪图片方法
- * @author 陈霓清
* @param bufferedImage 图像源
* @param startX 裁剪开始x坐标
* @param startY 裁剪开始y坐标
diff --git a/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java b/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java
deleted file mode 100644
index 9ab93ab..0000000
--- a/htool-picture/src/main/java/cn/javaex/htool/picture/util/BufferedImageBuilder.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package cn.javaex.htool.picture.util;
-
-import javax.swing.*;
-import java.awt.*;
-import java.awt.image.BufferedImage;
-
-/**
- * @author 韩建东 2022年11月27日
- */
-public class BufferedImageBuilder {
- public static BufferedImage toBufferedImage(Image image) {
-
- if (image instanceof BufferedImage) {
- return (BufferedImage) image;
-
- }
-
- image = new ImageIcon(image).getImage();
-
- BufferedImage bimage = null;
-
- GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
-
- try {
-
- int transparency = Transparency.OPAQUE;
-
- GraphicsDevice gs = ge.getDefaultScreenDevice();
-
- GraphicsConfiguration gc = gs.getDefaultConfiguration();
-
- bimage = gc.createCompatibleImage(image.getWidth(null),
-
- image.getHeight(null), transparency);
-
- } catch (HeadlessException e) {
- System.err.println("报错");
- }
-
- if (bimage == null) {
-
- int type = BufferedImage.TYPE_INT_RGB;
-
- bimage = new BufferedImage(image.getWidth(null),
-
- image.getHeight(null), type);
-
- }
-
- Graphics g = bimage.createGraphics();
-
- g.drawImage(image, 0, 0, null);
-
- g.dispose();
-
- return bimage;
-
- }
-}
--
Gitee