add SshjSftp

This commit is contained in:
looly
2022-01-04 07:06:47 +08:00
parent a59c87b7d2
commit f572056d5a
3 changed files with 50 additions and 25 deletions

View File

@@ -1,5 +1,6 @@
package cn.hutool.extra.ssh;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.StrUtil;
@@ -18,7 +19,6 @@ import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.List;
import java.util.stream.Collectors;
/**
* 在使用jsch 进行sftp协议下载文件时总是中文乱码而该框架源码又不允许设置编码。故站在巨人的肩膀上此类便孕育而出。
@@ -29,26 +29,54 @@ import java.util.stream.Collectors;
* </p>
*
* @author youyongkun
* @date 2021/12/31 14:51
* @since 5.7.18
* @since 5.7.19
*/
public class SshjSftp extends AbstractFtp {
private SSHClient ssh;
private SFTPClient sftp;
/**
* 构造,使用默认端口
*
* @param sshHost 主机
*/
public SshjSftp(String sshHost) {
this(new FtpConfig(sshHost, 22, null, null, CharsetUtil.CHARSET_UTF_8));
}
/**
* 构造
*
* @param sshHost 主机
* @param sshUser 用户名
* @param sshPass 密码
*/
public SshjSftp(String sshHost, String sshUser, String sshPass) {
this(new FtpConfig(sshHost, 22, sshUser, sshPass, CharsetUtil.CHARSET_UTF_8));
}
/**
* 构造
*
* @param sshHost 主机
* @param sshPort 端口
* @param sshUser 用户名
* @param sshPass 密码
*/
public SshjSftp(String sshHost, int sshPort, String sshUser, String sshPass) {
this(new FtpConfig(sshHost, sshPort, sshUser, sshPass, CharsetUtil.CHARSET_UTF_8));
}
/**
* 构造
*
* @param sshHost 主机
* @param sshPort 端口
* @param sshUser 用户名
* @param sshPass 密码
* @param charset 编码
*/
public SshjSftp(String sshHost, int sshPort, String sshUser, String sshPass, Charset charset) {
this(new FtpConfig(sshHost, sshPort, sshUser, sshPass, charset));
}
@@ -68,7 +96,6 @@ public class SshjSftp extends AbstractFtp {
* SSH 初始化并创建一个sftp客户端.
*
* @author youyongkun
* @date 2021/12/31 14:59
* @since 5.7.18
*/
public void init() {
@@ -115,22 +142,23 @@ public class SshjSftp extends AbstractFtp {
public boolean mkdir(String dir) {
try {
sftp.mkdir(dir);
return containsFile(dir);
} catch (IOException e) {
throw new FtpException(e);
}
return containsFile(dir);
}
@Override
public List<String> ls(String path) {
List<RemoteResourceInfo> infoList;
try {
List<RemoteResourceInfo> infoList = sftp.ls(path);
if (infoList != null && infoList.size() > 0) {
return infoList.stream().map(info -> info.getName()).collect(Collectors.toList());
}
infoList = sftp.ls(path);
} catch (IOException e) {
throw new FtpException(e);
}
if (CollUtil.isNotEmpty(infoList)) {
return CollUtil.map(infoList, RemoteResourceInfo::getName, true);
}
return null;
}
@@ -177,9 +205,7 @@ public class SshjSftp extends AbstractFtp {
public void recursiveDownloadFolder(String sourcePath, File destDir) {
List<String> files = ls(sourcePath);
if (files != null && !files.isEmpty()) {
files.forEach(path -> {
download(sourcePath + "/" + path, destDir);
});
files.forEach(path -> download(sourcePath + "/" + path, destDir));
}
}
@@ -199,7 +225,6 @@ public class SshjSftp extends AbstractFtp {
* @param fileDir 文件绝对路径
* @return true:包含 false:不包含
* @author youyongkun
* @date 2021/12/31 15:36
* @since 5.7.18
*/
public boolean containsFile(String fileDir) {
@@ -218,8 +243,7 @@ public class SshjSftp extends AbstractFtp {
* @param exec 命令
* @return 返回响应结果.
* @author youyongkun
* @date 2021/12/31 15:59
* @since 5.7.18
* @since 5.7.19
*/
public String command(String exec) {
Session session = null;
@@ -231,13 +255,7 @@ public class SshjSftp extends AbstractFtp {
} catch (Exception e) {
throw new FtpException(e);
} finally {
if (session != null) {
try {
session.close();
} catch (Exception e) {
throw new FtpException(e);
}
}
IoUtil.close(session);
}
}
}