还是前段时间,做了一个项目,里面需要访问并操作SFTP服务器。 百度了一些用例,记录一下。
主要引用的包
com.jcraft.jsch
工具类如下:
@Slf4j
public class SFTPClient {
private ChannelSftp sftp;
private Session session;
/*
* 登录sftp服务器,使用完成后,需调用logout方法登出
* */
public void login(String user, String psw, String host, int port, String privateKey) throws JSchException {
try {
if (sftp != null && sftp.isConnected()) {
logout();
}
JSch jsch = new JSch();
if (ObjectUtils.isNotEmpty(privateKey)) {
jsch.addIdentity(privateKey);
}
session = jsch.getSession(user, host, port);
if (ObjectUtils.isNotEmpty(psw)) {
session.setPassword(psw);
}
// 此步骤设置 第一次登录时,不提示 是否保存私钥
session.setConfig("StrictHostKeyChecking", "no");
session.connect(30000);
Channel channel = session.openChannel("sftp");
channel.connect();
sftp = (ChannelSftp) channel;
} catch (Exception e) {
log.error("SFTP连接异常:" + e.getMessage()+e);
}
}
/*
* 安全登出sftp服务器
* */
public void logout() {
if (sftp != null) {
if (sftp.isConnected()) {
sftp.disconnect();
}
}
if (session != null) {
if (session.isConnected()) {
session.disconnect();
}
}
}
// 使用sftp可以进行文件操作
// 获取文件
sftp.get(path);
// 上传文件
sftp.put(path);
// 访问文件夹
sftp.cd(path);
// 创建文件夹
sftp.mkdir(path);
/*
* src:需要获取的文件路径
* InputStream:文件流
* */
public InputStream getFile(String src) throws Exception {
isConnected();
try {
return sftp.get(src);
} catch (Exception e) {
logout();
log.error("获取文件出现异常 :" + e.getMessage());
throw e;
}
}
/*
* fileStream:需要上传的文件流
* targetFileSrc:上传目录的完整路径,包括文件名
* */
public void uploadFile(InputStream fileStream, String targetFileSrc) throws Exception {
isConnected();
OutputStream os = sftp.put(targetFileSrc);
if (ObjectUtils.isNotEmpty(os)) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
// 设定每次传输的数据块大小为256kb;
byte[] buff = new byte[1024 * 256];
int len;
while ((len = fileStream.read(buff)) != -1) {
baos.write(buff, 0, len);
}
baos.flush();
byte[] fileBytes = baos.toByteArray();
os.write(fileBytes);
} catch (IOException ioException) {
logout();
log.error("上传文件失败!异常信息:" + ioException.getMessage());
} finally {
os.flush();
os.close();
baos.flush();
baos.close();
}
} else {
log.info("获取os失败!上传文件失败!");
}
}
}