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