From 5f2210ec79b61ebb1ef7dcd5027db4e0bc0059f1 Mon Sep 17 00:00:00 2001 From: Guoqs <123@jsowell.com> Date: Mon, 3 Jun 2024 14:36:49 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E5=9B=BA=E4=BB=B6=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=88=B0FTP=E6=9C=8D=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/common/CommonController.java | 8 +- .../jsowell/common/util/file/FtpUtils.java | 13 +- .../com/jsowell/common/util/ip/IpUtils.java | 415 +++++++++--------- 3 files changed, 227 insertions(+), 209 deletions(-) diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/common/CommonController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/common/CommonController.java index 1122398f1..6b40db243 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/common/CommonController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/common/CommonController.java @@ -99,12 +99,8 @@ public class CommonController { // 上传文件路径 String filePath = JsowellConfig.getUploadPath(); // 上传并返回新文件名称 - String fileName = FileUploadUtils.upload(filePath, file); - try { - FtpUtils.upLoad(filePath, file); - } catch (Exception e) { - log.error("FTP上传固件error", e); - } + // String fileName = FileUploadUtils.upload(filePath, file); + String fileName = FtpUtils.upLoad(filePath, file); String url = serverConfig.getUrl() + fileName; AjaxResult ajax = AjaxResult.success(); ajax.put("url", url); diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/file/FtpUtils.java b/jsowell-common/src/main/java/com/jsowell/common/util/file/FtpUtils.java index 5fce3a35e..95a4b6603 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/file/FtpUtils.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/file/FtpUtils.java @@ -6,8 +6,10 @@ import com.jsowell.common.exception.file.FileSizeLimitExceededException; import com.jsowell.common.exception.file.InvalidExtensionException; +import com.jsowell.common.util.ServletUtils; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.id.IdUtils; +import com.jsowell.common.util.ip.IpUtils; import org.apache.commons.io.FilenameUtils; import org.apache.commons.net.ftp.FTPClient; @@ -48,20 +50,22 @@ public class FtpUtils { */ public static String upLoad(String baseDir, MultipartFile file) throws Exception { FTPClient ftp = new FTPClient(); + baseDir = "/"; try { /** 1. 检查文件大小和扩展名是否符合要求*/ assertFile(file); /** 2. 产生新的文件名,目的使得文件名统一为英文字符加数字;fileName包含文件后缀名*/ String fileName = reBuildFileName(file); /** 3. 连接ftp服务器*/ - ftp.connect(ftpConfig.getIp(), ftpConfig.getPort()); + String ip = IpUtils.getIpFormDomainName(ftpConfig.getIp()); + ftp.connect(ip, ftpConfig.getPort()); ftp.login(ftpConfig.getUsername(), ftpConfig.getPassword()); if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { // 不合法时断开连接 ftp.disconnect(); throw new IOException("ftp连接异常,异常码为:" + ftp.getReplyCode()); } - String path = ftpConfig.getUploadPath() + baseDir; + String path = baseDir; String[] dirs = path.split("/"); ftp.changeWorkingDirectory("/"); /** 4. 判断ftp服务器目录是否存在 不存在则创建*/ @@ -221,7 +225,8 @@ public class FtpUtils { public static final String reBuildFileName(MultipartFile file) { String fileName = file.getOriginalFilename(); String extension = getExtension(file); - fileName = IdUtils.fastUUID() + "." + extension; + // 2024年6月3日14点29分修改 保持原名称 + // fileName = IdUtils.fastUUID() + "." + extension; return fileName; } @@ -246,7 +251,7 @@ public class FtpUtils { * @return */ public static final boolean isAllowedExtension(String extension) { - for (String str : MimeTypeUtils.IMAGE_EXTENSION) { + for (String str : MimeTypeUtils.FIRMWARE_EXTENSION) { if (str.equalsIgnoreCase(extension)) { return true; } diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/ip/IpUtils.java b/jsowell-common/src/main/java/com/jsowell/common/util/ip/IpUtils.java index 4462d90a0..192d0941b 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/ip/IpUtils.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/ip/IpUtils.java @@ -1,6 +1,7 @@ package com.jsowell.common.util.ip; import com.jsowell.common.constant.Constants; +import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.StringUtils; import javax.servlet.http.HttpServletRequest; @@ -13,213 +14,229 @@ import java.net.UnknownHostException; * @author jsowell */ public class IpUtils { - /** - * 获取客户端IP - * - * @param request 请求对象 - * @return IP地址 - */ - public static String getIpAddr(HttpServletRequest request) { - if (request == null) { - return "unknown"; - } - String ip = request.getHeader("x-forwarded-for"); - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getHeader("Proxy-Client-IP"); - } - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getHeader("X-Forwarded-For"); - } - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getHeader("WL-Proxy-Client-IP"); - } - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getHeader("X-Real-IP"); - } + /** + * 获取客户端IP + * + * @param request 请求对象 + * @return IP地址 + */ + public static String getIpAddr(HttpServletRequest request) { + if (request == null) { + return "unknown"; + } + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Forwarded-For"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Real-IP"); + } - if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { - ip = request.getRemoteAddr(); - } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } - return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); - } + return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip); + } - /** - * 检查是否为内部IP地址 - * - * @param ip IP地址 - * @return 结果 - */ - public static boolean internalIp(String ip) { - byte[] addr = textToNumericFormatV4(ip); - return internalIp(addr) || "127.0.0.1".equals(ip); - } + /** + * 检查是否为内部IP地址 + * + * @param ip IP地址 + * @return 结果 + */ + public static boolean internalIp(String ip) { + byte[] addr = textToNumericFormatV4(ip); + return internalIp(addr) || "127.0.0.1".equals(ip); + } - /** - * 检查是否为内部IP地址 - * - * @param addr byte地址 - * @return 结果 - */ - private static boolean internalIp(byte[] addr) { - if (StringUtils.isNull(addr) || addr.length < 2) { - return true; - } - final byte b0 = addr[0]; - final byte b1 = addr[1]; - // 10.x.x.x/8 - final byte SECTION_1 = 0x0A; - // 172.16.x.x/12 - final byte SECTION_2 = (byte) 0xAC; - final byte SECTION_3 = (byte) 0x10; - final byte SECTION_4 = (byte) 0x1F; - // 192.168.x.x/16 - final byte SECTION_5 = (byte) 0xC0; - final byte SECTION_6 = (byte) 0xA8; - switch (b0) { - case SECTION_1: - return true; - case SECTION_2: - if (b1 >= SECTION_3 && b1 <= SECTION_4) { - return true; - } - case SECTION_5: - switch (b1) { - case SECTION_6: - return true; - } - default: - return false; - } - } + /** + * 检查是否为内部IP地址 + * + * @param addr byte地址 + * @return 结果 + */ + private static boolean internalIp(byte[] addr) { + if (StringUtils.isNull(addr) || addr.length < 2) { + return true; + } + final byte b0 = addr[0]; + final byte b1 = addr[1]; + // 10.x.x.x/8 + final byte SECTION_1 = 0x0A; + // 172.16.x.x/12 + final byte SECTION_2 = (byte) 0xAC; + final byte SECTION_3 = (byte) 0x10; + final byte SECTION_4 = (byte) 0x1F; + // 192.168.x.x/16 + final byte SECTION_5 = (byte) 0xC0; + final byte SECTION_6 = (byte) 0xA8; + switch (b0) { + case SECTION_1: + return true; + case SECTION_2: + if (b1 >= SECTION_3 && b1 <= SECTION_4) { + return true; + } + case SECTION_5: + switch (b1) { + case SECTION_6: + return true; + } + default: + return false; + } + } - /** - * 将IPv4地址转换成字节 - * - * @param text IPv4地址 - * @return byte 字节 - */ - public static byte[] textToNumericFormatV4(String text) { - if (text.length() == 0) { - return null; - } + /** + * 将IPv4地址转换成字节 + * + * @param text IPv4地址 + * @return byte 字节 + */ + public static byte[] textToNumericFormatV4(String text) { + if (text.length() == 0) { + return null; + } - byte[] bytes = new byte[4]; - String[] elements = text.split("\\.", -1); - try { - long l; - int i; - switch (elements.length) { - case 1: - l = Long.parseLong(elements[0]); - if ((l < 0L) || (l > 4294967295L)) { - return null; - } - bytes[0] = (byte) (int) (l >> 24 & 0xFF); - bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); - bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); - bytes[3] = (byte) (int) (l & 0xFF); - break; - case 2: - l = Integer.parseInt(elements[0]); - if ((l < 0L) || (l > 255L)) { - return null; - } - bytes[0] = (byte) (int) (l & 0xFF); - l = Integer.parseInt(elements[1]); - if ((l < 0L) || (l > 16777215L)) { - return null; - } - bytes[1] = (byte) (int) (l >> 16 & 0xFF); - bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); - bytes[3] = (byte) (int) (l & 0xFF); - break; - case 3: - for (i = 0; i < 2; ++i) { - l = Integer.parseInt(elements[i]); - if ((l < 0L) || (l > 255L)) { - return null; - } - bytes[i] = (byte) (int) (l & 0xFF); - } - l = Integer.parseInt(elements[2]); - if ((l < 0L) || (l > 65535L)) { - return null; - } - bytes[2] = (byte) (int) (l >> 8 & 0xFF); - bytes[3] = (byte) (int) (l & 0xFF); - break; - case 4: - for (i = 0; i < 4; ++i) { - l = Integer.parseInt(elements[i]); - if ((l < 0L) || (l > 255L)) { - return null; - } - bytes[i] = (byte) (int) (l & 0xFF); - } - break; - default: - return null; - } - } catch (NumberFormatException e) { - return null; - } - return bytes; - } + byte[] bytes = new byte[4]; + String[] elements = text.split("\\.", -1); + try { + long l; + int i; + switch (elements.length) { + case 1: + l = Long.parseLong(elements[0]); + if ((l < 0L) || (l > 4294967295L)) { + return null; + } + bytes[0] = (byte) (int) (l >> 24 & 0xFF); + bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 2: + l = Integer.parseInt(elements[0]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[0] = (byte) (int) (l & 0xFF); + l = Integer.parseInt(elements[1]); + if ((l < 0L) || (l > 16777215L)) { + return null; + } + bytes[1] = (byte) (int) (l >> 16 & 0xFF); + bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 3: + for (i = 0; i < 2; ++i) { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + l = Integer.parseInt(elements[2]); + if ((l < 0L) || (l > 65535L)) { + return null; + } + bytes[2] = (byte) (int) (l >> 8 & 0xFF); + bytes[3] = (byte) (int) (l & 0xFF); + break; + case 4: + for (i = 0; i < 4; ++i) { + l = Integer.parseInt(elements[i]); + if ((l < 0L) || (l > 255L)) { + return null; + } + bytes[i] = (byte) (int) (l & 0xFF); + } + break; + default: + return null; + } + } catch (NumberFormatException e) { + return null; + } + return bytes; + } - /** - * 获取IP地址 - * - * @return 本地IP地址 - */ - public static String getHostIp() { - try { - return InetAddress.getLocalHost().getHostAddress(); - } catch (UnknownHostException e) { - } - return "127.0.0.1"; - } + /** + * 获取IP地址 + * + * @return 本地IP地址 + */ + public static String getHostIp() { + try { + return InetAddress.getLocalHost().getHostAddress(); + } catch (UnknownHostException e) { + } + return "127.0.0.1"; + } - /** - * 获取主机名 - * - * @return 本地主机名 - */ - public static String getHostName() { - try { - return InetAddress.getLocalHost().getHostName(); - } catch (UnknownHostException e) { - } - return "未知"; - } + /** + * 获取主机名 + * + * @return 本地主机名 + */ + public static String getHostName() { + try { + return InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + } + return "未知"; + } - /** - * 从多级反向代理中获得第一个非unknown IP地址 - * - * @param ip 获得的IP地址 - * @return 第一个非unknown IP地址 - */ - public static String getMultistageReverseProxyIp(String ip) { - // 多级反向代理检测 - if (ip != null && ip.indexOf(Constants.DEFAULT_DELIMITER) > 0) { - final String[] ips = ip.trim().split(Constants.DEFAULT_DELIMITER); - for (String subIp : ips) { - if (false == isUnknown(subIp)) { - ip = subIp; - break; - } - } - } - return ip; - } + /** + * 从多级反向代理中获得第一个非unknown IP地址 + * + * @param ip 获得的IP地址 + * @return 第一个非unknown IP地址 + */ + public static String getMultistageReverseProxyIp(String ip) { + // 多级反向代理检测 + if (ip != null && ip.indexOf(Constants.DEFAULT_DELIMITER) > 0) { + final String[] ips = ip.trim().split(Constants.DEFAULT_DELIMITER); + for (String subIp : ips) { + if (false == isUnknown(subIp)) { + ip = subIp; + break; + } + } + } + return ip; + } - /** - * 检测给定字符串是否为未知,多用于检测HTTP请求相关 - * - * @param checkString 被检测的字符串 - * @return 是否未知 - */ - public static boolean isUnknown(String checkString) { - return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); - } + /** + * 检测给定字符串是否为未知,多用于检测HTTP请求相关 + * + * @param checkString 被检测的字符串 + * @return 是否未知 + */ + public static boolean isUnknown(String checkString) { + return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); + } + + /** + * 根据域名获取ip + * @param domainName + * @return + */ + public static String getIpFormDomainName(String domainName) { + String ip; + try { + String server = StringUtils.removeHttp(domainName); + ip = InetAddress.getByName(server).getHostAddress(); + } catch (UnknownHostException e) { + throw new BusinessException("", "无法解析出IP"); + } + return ip; + } } \ No newline at end of file