From d9c657aa78cf0ebe31933a87e63ca92edd8a8da3 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 11 六月 2026 09:57:50 +0800
Subject: [PATCH] 数据采集站

---
 server/system_service/src/main/java/com/doumee/core/utils/FtpUtil.java |  142 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 142 insertions(+), 0 deletions(-)

diff --git a/server/system_service/src/main/java/com/doumee/core/utils/FtpUtil.java b/server/system_service/src/main/java/com/doumee/core/utils/FtpUtil.java
index 5d66ed2..c5165a7 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/FtpUtil.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/FtpUtil.java
@@ -304,6 +304,148 @@
 		return false;
 	}
 
+	/** 浠� FTP 璇诲彇杩滅▼鏂囦欢骞跺啓鍏ヨ緭鍑烘祦锛堢敤浜庡湪绾块瑙�/涓嬭浇锛� */
+	public boolean streamRemoteFile(String remote, OutputStream outputStream) throws IOException {
+		if (streamRemoteFileInternal(remote, outputStream, 0, -1)) {
+			return true;
+		}
+		if (remote.startsWith("/")) {
+			return streamRemoteFileInternal(remote.substring(1), outputStream, 0, -1);
+		}
+		return streamRemoteFileByCwd(remote, outputStream, 0, -1);
+	}
+
+	/** 鎸夊瓧鑺傝寖鍥翠粠 FTP 璇诲彇杩滅▼鏂囦欢锛堟敮鎸� MP4 鍒嗘鎾斁锛� */
+	public boolean streamRemoteFileRange(String remote, OutputStream outputStream, long start, long length) throws IOException {
+		if (streamRemoteFileInternal(remote, outputStream, start, length)) {
+			return true;
+		}
+		if (remote.startsWith("/")) {
+			return streamRemoteFileInternal(remote.substring(1), outputStream, start, length);
+		}
+		return streamRemoteFileByCwd(remote, outputStream, start, length);
+	}
+
+	public long getRemoteFileSize(String remote) throws IOException {
+		Long size = resolveRemoteFileSize(remote);
+		if (size != null) {
+			return size;
+		}
+		if (remote.startsWith("/")) {
+			size = resolveRemoteFileSize(remote.substring(1));
+		}
+		return size != null ? size : -1L;
+	}
+
+	private Long resolveRemoteFileSize(String remote) throws IOException {
+		String originalCwd = ftpClient.printWorkingDirectory();
+		try {
+			ftpClient.enterLocalPassiveMode();
+			FTPFile[] files = ftpClient.listFiles(new String(remote.getBytes("GBK"), "iso-8859-1"));
+			if (files != null && files.length == 1 && files[0].isFile()) {
+				return files[0].getSize();
+			}
+			if (remote.contains("/")) {
+				String directory = remote.substring(0, remote.lastIndexOf('/') + 1);
+				String fileName = remote.substring(remote.lastIndexOf('/') + 1);
+				if (ftpClient.changeWorkingDirectory(new String(directory.getBytes("GBK"), "iso-8859-1"))) {
+					files = ftpClient.listFiles(new String(fileName.getBytes("GBK"), "iso-8859-1"));
+					if (files != null && files.length == 1 && files[0].isFile()) {
+						return files[0].getSize();
+					}
+				}
+			}
+			return null;
+		} finally {
+			if (originalCwd != null) {
+				ftpClient.changeWorkingDirectory(originalCwd);
+			}
+		}
+	}
+
+	private boolean streamRemoteFileInternal(String remote, OutputStream outputStream, long start, long length) throws IOException {
+		InputStream in = null;
+		try {
+			ftpClient.enterLocalPassiveMode();
+			ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+			if (start > 0) {
+				ftpClient.setRestartOffset(start);
+			}
+			String encoded = new String(remote.getBytes("GBK"), "iso-8859-1");
+			in = ftpClient.retrieveFileStream(encoded);
+			if (in == null) {
+				return false;
+			}
+			byte[] buffer = new byte[8192];
+			long remaining = length;
+			int len;
+			while ((len = in.read(buffer)) != -1) {
+				if (length >= 0 && remaining <= 0) {
+					break;
+				}
+				int writeLen = len;
+				if (length >= 0 && writeLen > remaining) {
+					writeLen = (int) remaining;
+				}
+				outputStream.write(buffer, 0, writeLen);
+				if (length >= 0) {
+					remaining -= writeLen;
+				}
+			}
+			outputStream.flush();
+			return ftpClient.completePendingCommand();
+		} finally {
+			if (in != null) {
+				in.close();
+			}
+		}
+	}
+
+	private boolean streamRemoteFileByCwd(String remote, OutputStream outputStream, long start, long length) throws IOException {
+		if (!remote.contains("/")) {
+			return false;
+		}
+		String directory = remote.substring(0, remote.lastIndexOf('/') + 1);
+		String fileName = remote.substring(remote.lastIndexOf('/') + 1);
+		ftpClient.enterLocalPassiveMode();
+		ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+		if (!ftpClient.changeWorkingDirectory(new String(directory.getBytes("GBK"), "iso-8859-1"))) {
+			return false;
+		}
+		if (start > 0) {
+			ftpClient.setRestartOffset(start);
+		}
+		InputStream in = null;
+		try {
+			in = ftpClient.retrieveFileStream(new String(fileName.getBytes("GBK"), "iso-8859-1"));
+			if (in == null) {
+				return false;
+			}
+			byte[] buffer = new byte[8192];
+			long remaining = length;
+			int len;
+			while ((len = in.read(buffer)) != -1) {
+				if (length >= 0 && remaining <= 0) {
+					break;
+				}
+				int writeLen = len;
+				if (length >= 0 && writeLen > remaining) {
+					writeLen = (int) remaining;
+				}
+				outputStream.write(buffer, 0, writeLen);
+				if (length >= 0) {
+					remaining -= writeLen;
+				}
+			}
+			outputStream.flush();
+			return ftpClient.completePendingCommand();
+		} finally {
+			if (in != null) {
+				in.close();
+			}
+		}
+	}
+
 	public boolean uploadInputstreamBatch(InputStream inputStream, String remote, Boolean close , Integer index )  {
 		// 璁剧疆PassiveMode浼犺緭
 		try {

--
Gitblit v1.9.3