doum
2026-06-11 d9c657aa78cf0ebe31933a87e63ca92edd8a8da3
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 {