From 41a3379377db8592540c3cee0698ab92028a7a82 Mon Sep 17 00:00:00 2001 From: kirito <731036390@qq.com> Date: Fri, 22 Dec 2023 16:52:55 +0800 Subject: [PATCH 1/2] =?UTF-8?q?FTP=E6=96=B0=E5=A2=9E=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E8=BF=9C=E7=A8=8B=E6=96=87=E4=BB=B6=E8=BE=93=E5=85=A5=E6=B5=81?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/hutool/extra/ftp/CommonsFtp.java | 42 +++++++++++++++++++ .../org/dromara/hutool/extra/ftp/Ftp.java | 9 ++++ .../extra/ssh/engine/jsch/JschSftp.java | 15 +++++++ .../extra/ssh/engine/sshj/SshjSftp.java | 11 +++++ .../org/dromara/hutool/extra/ftp/FtpTest.java | 15 +++++++ 5 files changed, 92 insertions(+) diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/CommonsFtp.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/CommonsFtp.java index 48ddc20ea..06eb0ad17 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/CommonsFtp.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/CommonsFtp.java @@ -728,6 +728,48 @@ public class CommonsFtp extends AbstractFtp { } } + /** + * 读取FTP服务器上的文件为输入流 + * + * @param path 文件路径 + * @return {@link InputStream} + */ + @Override + public InputStream read(String path) { + final String fileName = FileNameUtil.getName(path); + final String dir = StrUtil.removeSuffix(path, fileName); + return read(dir, fileName); + } + + /** + * 读取文件为输入流 + * + * @param path 服务端的文件路径 + * @param fileName 服务端的文件名 + * @return {@link InputStream} + * @throws IORuntimeException IO异常 + */ + public InputStream read(String path, String fileName) throws IORuntimeException { + String pwd = null; + if (isBackToPwd()) { + pwd = pwd(); + } + + if (!cd(path)) { + throw new FtpException("Change dir to [{}] error, maybe dir not exist!", path); + } + try { + client.setFileType(FTPClient.BINARY_FILE_TYPE); + return client.retrieveFileStream(fileName); + } catch (IOException e) { + throw new IORuntimeException(e); + } finally { + if (isBackToPwd()) { + cd(pwd); + } + } + } + /** * 获取FTPClient客户端对象 * diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/Ftp.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/Ftp.java index 514c4820d..18fb1f3e5 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/Ftp.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/Ftp.java @@ -6,6 +6,7 @@ import org.rythmengine.utils.F; import java.io.Closeable; import java.io.File; +import java.io.InputStream; import java.nio.charset.Charset; import java.util.List; @@ -153,4 +154,12 @@ public interface Ftp extends Closeable { * @since 5.3.5 */ void recursiveDownloadFolder(String sourcePath, File destDir); + + /** + * 读取FTP服务器上的文件为输入流 + * + * @param path 文件路径 + * @return {@link InputStream} + */ + InputStream read(String path); } diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/ssh/engine/jsch/JschSftp.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/ssh/engine/jsch/JschSftp.java index 8af81ab47..b8f3135fa 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/ssh/engine/jsch/JschSftp.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/ssh/engine/jsch/JschSftp.java @@ -633,6 +633,21 @@ public class JschSftp extends AbstractFtp { return this; } + /** + * 读取远程文件流 + * + * @param path 远程文件路径 + * @return 输入流 + */ + @Override + public InputStream read(String path) { + try { + return getClient().get(path); + } catch (final SftpException e) { + throw new SshException(e); + } + } + @Override public void close() { JschUtil.close(this.channel); diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/ssh/engine/sshj/SshjSftp.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/ssh/engine/sshj/SshjSftp.java index e08723422..8040a8a07 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/ssh/engine/sshj/SshjSftp.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/ssh/engine/sshj/SshjSftp.java @@ -226,6 +226,17 @@ public class SshjSftp extends AbstractFtp { } } + /** + * 读取远程文件输入流 + * + * @param path 远程文件路径 + * @return {@link InputStream} + */ + @Override + public InputStream read(String path) { + throw new UnsupportedOperationException("sshjSftp不支持读取远程文件输入流!"); + } + @Override public void close() { try { diff --git a/hutool-extra/src/test/java/org/dromara/hutool/extra/ftp/FtpTest.java b/hutool-extra/src/test/java/org/dromara/hutool/extra/ftp/FtpTest.java index c08a5a06b..f734a2d51 100644 --- a/hutool-extra/src/test/java/org/dromara/hutool/extra/ftp/FtpTest.java +++ b/hutool-extra/src/test/java/org/dromara/hutool/extra/ftp/FtpTest.java @@ -16,10 +16,13 @@ import org.apache.commons.net.ftp.FTPSClient; import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.io.file.FileUtil; import org.dromara.hutool.core.lang.Console; +import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.extra.ssh.engine.jsch.JschSftp; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; +import java.io.BufferedReader; +import java.io.InputStreamReader; import java.util.List; public class FtpTest { @@ -128,6 +131,18 @@ public class FtpTest { } } + @Test + @Disabled + public void readTest() throws Exception { + try (final CommonsFtp ftp = CommonsFtp.of("localhost"); + final BufferedReader reader = new BufferedReader(new InputStreamReader(ftp.read("d://test/read/", "test.txt")))) { + String line; + while (StrUtil.isNotBlank(line = reader.readLine())) { + Console.log(line); + } + } + } + @Test @Disabled public void existSftpTest() { From 5a497018451ef627c29516990534bc89da90a55b Mon Sep 17 00:00:00 2001 From: kirito <731036390@qq.com> Date: Fri, 22 Dec 2023 16:57:24 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/hutool/extra/ftp/CommonsFtp.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/CommonsFtp.java b/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/CommonsFtp.java index 06eb0ad17..cb16046da 100644 --- a/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/CommonsFtp.java +++ b/hutool-extra/src/main/java/org/dromara/hutool/extra/ftp/CommonsFtp.java @@ -744,19 +744,19 @@ public class CommonsFtp extends AbstractFtp { /** * 读取文件为输入流 * - * @param path 服务端的文件路径 + * @param dir 服务端的文件目录 * @param fileName 服务端的文件名 * @return {@link InputStream} * @throws IORuntimeException IO异常 */ - public InputStream read(String path, String fileName) throws IORuntimeException { + public InputStream read(String dir, String fileName) throws IORuntimeException { String pwd = null; if (isBackToPwd()) { pwd = pwd(); } - if (!cd(path)) { - throw new FtpException("Change dir to [{}] error, maybe dir not exist!", path); + if (!cd(dir)) { + throw new FtpException("Change dir to [{}] error, maybe dir not exist!", dir); } try { client.setFileType(FTPClient.BINARY_FILE_TYPE);