目录
一、工具类代码
二、pom文件
三、核心代码示例
四、补充:秘钥证书登录
一、工具类代码
public class SFTPUtil { private transient Logger logger = LoggerFactory.getLogger(this.getClass()); private ChannelSftp sftp; private Session session; /** * SFTP 登录用户名 */ private String username; /** * SFTP 登录密码 */ private String password; /** * SFTP 服务器地址IP地址 */ private String host; /** * SFTP 端口 */ private int port; /** * 构造基于密码认证的sftp对象 */ public SFTPUtil(String username, String password, String host, int port) { this.username = username; this.password = password; this.host = host; this.port = port; } public SFTPUtil() { } /** * 连接sftp服务器 */ public void login() { try { JSch jsch = new JSch(); if (privateKey != null) { jsch.addIdentity(privateKey);// 设置私钥 jsch.addIdentity(privateKey, pripass); } session = jsch.getSession(username, host, port); if (password != null) { session.setPassword(password); } Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); session.connect(); Channel channel = session.openChannel("sftp"); channel.connect(); sftp = (ChannelSftp) channel; } catch (JSchException e) { e.printStackTrace(); logger.info("sftp login exception:{}", e); } } /** * 关闭连接 server */ public void logout() { if (sftp != null) { if (sftp.isConnected()) { sftp.disconnect(); } } if (session != null) { if (session.isConnected()) { session.disconnect(); } } } /** * 下载文件。 * * @param directory 下载目录 * @param downloadFile 下载的文件 * @param saveFile 存在本地的路径 */ public void download(String directory, String downloadFile, String saveFile) throws SftpException, FileNotFoundException { if (directory != null && !"".equals(directory)) { sftp.cd(directory); } File file = new File(saveFile); sftp.get(downloadFile, new FileOutputStream(file)); } /** * 删除文件 * * @param directory 要删除文件所在目录 * @param deleteFile 要删除的文件 */ public void delete(String directory, String deleteFile) throws SftpException { sftp.cd(directory); sftp.rm(deleteFile); } /** * 列出目录下的文件 * * @param directory 要列出的目录 */ public Vector<?> listFiles(String directory) throws SftpException { return sftp.ls(directory); } public List<String> getdownloads(String fileName, String contains) throws SftpException { List<String> list = new ArrayList<String>(); logger.info("下载中。。"); Vector vector = listFiles(fileName); for (int i = 0; i < vector.size(); i++) { ChannelSftp.LsEntry entry = (LsEntry) vector.get(i); if (entry.getFilename().contains(contains)) { list.add(entry.getFilename()); } } return list; } }
二、pom文件
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.53</version>
</dependency>
三、核心代码示例
public String downloadFile(String date) { String comPath = null; try { SFTPUtil sftp = new SFTPUtil(UserName, hPassWord, Host, Integer.parseInt(port)); sftp.login(); logger.info("登录sftp"); TextUtil.createFile(filePath+"/"+date+"/"+iceName+"/"); List<String> list=sftp.getdownloads(SftpPath, date); for (int i = 0; i < list.size(); i++) { String file=list.get(i); comPath = filePath+"/"+date+"/"+iceName+"/"+file; logger.info("下载文件名:" + comPath); sftp.download(SftpPath, file,comPath); } sftp.logout(); return comPath; } catch (SftpException e) { logger.error("下载失败:", e); return null; } catch (IOException e) { logger.error("下载失败:", e); return null; } }
public class TextUtil { /** * 创建目录 * @return * @throws IOException */ public static void createFile(String fileName) throws IOException{ File file = new File(fileName); if(!file.exists()){ file.mkdirs(); } } }
四、补充:秘钥证书登录
import com.jcraft.jsch.*;
import java.util.Vector;
public class LoginTest {
//SFTP地址
private static final String HOST = "IP地址";
//端口
private static final int PORT = 2222;
//用户名
private static final String USERNAME = "adminabc";
//证书路径
private static final String PRIVATE_KEY_PATH = "E://03/abc.rsa";
//SFTP文件目录
private static final String sftpPath = "/aa/bb/cc";
//本地测试目录
private static final String localFilePath = "E://04/";
//下载关键字
private static final String keyWord = "20240123";
public static void loginWithCertificate() {
//创建 JSch 实例
JSch jsch = new JSch();
try {
jsch.addIdentity(PRIVATE_KEY_PATH);
//创建 SSH 会话
Session session = jsch.getSession(USERNAME, HOST, PORT);
/**
* 设置了会话的配置。StrictHostKeyChecking 是一个 SSH 选项,用于控制 SSH 客户端如何处理未知的主机密钥。
* "yes" 表示客户端会检查主机密钥,"no" 表示客户端会忽略主机密钥,"ask" 表示客户端会提示用户是否接受主机密钥。
* 设置为 "no" 表示客户端不会检查主机密钥是否已知,这可能会导致“man in the middle”攻击,因此只应在测试环境中使用。
*/
session.setConfig("StrictHostKeyChecking", "no");
//连接 SSH 服务器,会话将尝试与服务器建立连接
session.connect();
//通过调用 openChannel("sftp") 方法,客户端请求一个 SFTP 通道。此方法返回一个 ChannelSftp 对象,该对象可用于执行 SFTP 操作。
Channel channel = session.openChannel("sftp");
//连接 SFTP 通道,通道将尝试与服务器建立连接
channel.connect();
//将 channel 强制转换为 ChannelSftp 类型,并将其赋值给 sftpChannel 变量。
//使用 sftpChannel 对象来执行各种 SFTP 操作,例如上传/下载文件、列出目录等
ChannelSftp sftpChannel = (ChannelSftp) channel;
//登录部分在这里就已经完成了,如果要做成工具类,可以从这里到异常抛出,中间这一部分代码提出
//登录以后,下载指定目录的文件
//判断某路径下文件是否存在,如果存在,下载该路径下所有文件
if (!isDirExist(sftpPath,sftpChannel)) {
//当前文件目录存在
System.out.println("目标目录不存在!");
return;
}
//方法通常用于从 SFTP 服务器下载单个文件。如果要下载整个文件夹,通常需要遍历文件夹
Vector vector = sftpChannel.ls(sftpPath);
for (int i = 0; i < vector.size(); i++) {
ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) vector.get(i);
System.out.println("entry.getFilename():" + entry.getFilename());
if (entry.getFilename().contains(keyWord)) {
sftpChannel.get(sftpPath+"/"+entry.getFilename(), localFilePath+"/"+entry.getFilename());
}
}
sftpChannel.disconnect();
session.disconnect();
} catch (JSchException e) {
System.out.println("JSchException");
e.printStackTrace();
} catch (SftpException e) {
System.out.println("SftpException");
throw new RuntimeException(e);
}
}
/**
* 判断目录是否存在
*/
public static boolean isDirExist(String directory, ChannelSftp sftp) {
boolean isDirExistFlag = false;
try {
//ChannelSftp 是 JSch 中用于 SFTP (SSH 文件传输协议) 的一个类。
//lstat() 是 ChannelSftp 类的一个方法,用于获取文件或目录的详细信息,但不包括其内容。
//它返回一个 SftpATTRS 对象,该对象包含有关文件或目录的信息,如权限、所有者、大小等。
SftpATTRS sftpATTRS = sftp.lstat(directory);
isDirExistFlag = true;
return sftpATTRS.isDir();
} catch (Exception e) {
if ("no such file".equals(e.getMessage().toLowerCase())) {
isDirExistFlag = false;
}
}
return isDirExistFlag;
}
public static void main(String[] args) {
loginWithCertificate();
}
}