概述
将文件上传到sftp,后者从sftp上拉取文件。
(未完待续。。。)
代码
package com.wzh.utils;
import com.jcraft.jsch.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.InputStream;
import java.util.List;
/**
* sftp工具类
*
* @author weizhenhui
* @date 2021/4/30 10:53
*/
public class SftpUtil {
Logger logger = LoggerFactory.getLogger(SftpUtil.class);
private static ChannelSftp sftp;
private String username;
private String password;
private String host;
private int port;
public SftpUtil(String username, String password, String host, int port) {
this.username = username;
this.password = password;
this.host = host;
this.port = port;
}
/**
* 连接sftp服务
*
* @throws JSchException
*/
public void connectSftp() throws JSchException {
logger.info("连接SFTP =>> " + host + ":" + port + ", username:" + username);
if (sftp == null || !sftp.isConnected()) {
if (sftp == null) {
logger.info("连接SFTP =>> 开始连接...");
} else {
logger.info("连接SFTP =>> 连接中断,开始重新连接...");
}
JSch jsch = new JSch();
Session session = jsch.getSession(username, host, port);
session.setPassword(password);
// 设置是否需要确认连接为no
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
session.connect(60000);
logger.info("连接SFTP =>> Session is connected");
Channel channel = session.openChannel("sftp");
channel.getId();
channel.connect();
sftp = (ChannelSftp) channel;
logger.info("连接SFTP =>> Channel is connected");
} else {
logger.info("连接SFTP =>> Channel is exist");
}
}
@Override
public String toString() {
return "SFTP连接信息:" + host + ":" + port + ", username=" + username + ", password=" + password;
}
/**
* 批量上传
*
* @param directory 目录格式:AAA/BBB/CCC
* @param isList 需要上传的文件的输入流的List集合
* @param fileNameList 与输入流集合对应的需要保存的文件名称
* @date: 2021/4/30 10:45
*/
public boolean bacthUploadFile(String directory, List<InputStream> isList, List<String> fileNameList) throws Exception {
try {
// 连接sftp服务
connectSftp();
logger.info("上传SFTP文件 开始 =>> 根目录:" + sftp.getHome());
for (int i = 0; i < isList.size(); i++) {
uploadFile(directory, isList.get(i), fileNameList.get(i));
}
logger.info("上传SFTP文件 结束 =>> 当前目录:" + sftp.pwd());
return true;
} catch (Exception e) {
e.printStackTrace();
throw new Exception("文件上传失败:" + e.getMessage());
}
}
/**
* 上传单个文件
*
* @date: 2021/4/30 10:49
*/
private void uploadFile(String directory, InputStream fileInput, String fileName) throws Exception {
try {
if (directory.equals(sftp.pwd())) {
logger.info("上传SFTP文件 =>> 已在[" + directory + "]目录");
} else {
logger.info("上传SFTP文件 =>> 当前目录[" + sftp.pwd() + "], 目标目录[" + directory + "], 开始进入目录");
// 以根目录开始定位
sftp.cd("/");
mkMultiDir(directory);
}
} catch (Exception e) {
e.printStackTrace();
throw new Exception("上传失败 file:" + directory + "/" + fileName + ",error:" + e.getMessage());
}
sftp.put(fileInput, fileName);
logger.info("上传SFTP文件 =>> 上传文件成功,文件路径:" + directory + "/" + fileName);
}
/**
* 创建/切换目录
*
* @date: 2021/4/30 10:49
*/
private void mkMultiDir(String directory) throws Exception {
String[] dirArr = directory.split("/");
for (String dir : dirArr) {
if (StringUtils.isEmpty(dir)) {
continue;
}
try {
sftp.cd(dir);
logger.info("上传SFTP文件 =>> 目录[" + dir + "]存在,进入目录");
} catch (SftpException e) {
try {
logger.info("上传SFTP文件 =>> 目录[" + dir + "]不存在,开始创建");
sftp.mkdir(dir);
logger.info("上传SFTP文件 =>> 目录[" + dir + "]创建成功, 进入目录[" + dir + "]");
sftp.cd(dir);
} catch (SftpException e1) {
e1.printStackTrace();
throw new Exception("上传SFTP失败,创建目录[" + dir + "]异常,error:" + e1.getMessage());
}
}
}
}
}
附上sftp处理以及日志打印需要的maven依赖:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.50</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>