JAVA 连接sftp服务器,用户名密码方式链接
添加maven依赖:
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
链接SFTP
下面展示一些 内联代码片
。
/**
* 连接sftp服务器
*/
public static ChannelSftp login(String host, int port, String username, String password) {
logger.info("SftpUtils login begin");
Session session = null;
String config = "Port "+port+"\n" +
"\n" +
"Host foo\n" +
" User "+username+"\n" +
" Hostname "+host+"\n" +
"Host *\n" +
" ConnectTime 3000\n" +
" PerferredAuthentications Keyboard-interact,password,publicKey\n" +
" #ForwardAgent yes\n" +
" #StrictHostKeyChecking no\n" +
" #identiyFile ~/.ssh/id_rsa\n" +
" #UserKnownHostFile ~/.shh/known_hosts";
ConfigRepository configRepository = null;
try {
configRepository = OpenSSHConfig.parse(config);
JSch jSch = new JSch();
jSch.setConfigRepository(configRepository);
//"foo" is from "Host foo" in the above config
session = jSch.getSession("foo");
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect(18000);
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftp = (ChannelSftp) channel;
logger.info("SftpUtils login end");
return sftp;
} catch (JSchException | IOException e) {
logger.error("连接SFTP服务器失败", e);
return null;
}
}
关闭连接 server
下面展示一些 内联代码片
。
// A code block
var foo = 'bar';
/**
* 关闭连接 server
*/
public static void logout(ChannelSftp sftp){
logger.info("SftpUtils logout begin");
if (sftp != null) {
Session session = null;
try {
session = sftp.getSession();
if (sftp.isConnected()) {
sftp.disconnect();
}
} catch (JSchException e) {
logger.error("获取session失败", e);
} finally {
if (session != null) {
session.disconnect();
}
}
}
logger.info("SftpUtils logout end");
}
SFTP上传
下面展示一些 内联代码片
。
/**
* 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
* basePath 服务器的基础路径
* directory 上传到该目录
* sftpFileName sftp端文件名
* in 输入流
*/
public static boolean upload(String host, int port, String username, String password, String basePath, String sftpFileName, InputStream input) {
logger.info("SftpUtils upload begin");
boolean success = true;
ChannelSftp sftp = login(host, port, username, password);
try {
sftp.cd(basePath);
} catch (SftpException e) {
//目录不存在,则创建文件夹
String [] dirs = basePath.split("/");
String tempPath = "";
for(String dir:dirs){
if(null== dir || "".equals(dir)) {
continue;
}
tempPath+="/"+dir;
try {
sftp.cd(tempPath);
} catch (SftpException e1) {
try {
sftp.mkdir(tempPath);
sftp.cd(tempPath);
} catch (SftpException e2) {
logger.error("创建文件夹失败", e2);
//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("创建文件夹失败"));
}
}
try{
sftp.cd(tempPath);
}catch(SftpException e1){
logger.error("SFTP服务器异常", e1);
//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("SFTP服务器异常"));
}
}
}
try {
//上传文件
sftp.put(input, sftpFileName);
} catch (SftpException e) {
// TODO Auto-generated catch block
logger.error("上传文件失败", e);
// throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("上传文件失败"));
success = false;
} finally {
logout(sftp);
}
logger.info("SftpUtils upload end");
return success;
}
SFTP下载
下面展示一些 内联代码片
。
/**
* 下载文件。
* directory 下载目录
* downloadFile 下载的文件
* saveFile 存在本地的路径
*/
public static boolean download(String host, int port, String username, String password, String filePath, final OutputStream outputStream) {
logger.info("SftpUtils download begin");
boolean downloaded = true;
ChannelSftp sftp = login(host, port, username, password);
String fileName = null;
try {
if (filePath != null && !"".equals(filePath)) {
String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));
sftp.cd(directory);
}
fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);
sftp.get(fileName, outputStream);
} catch (SftpException e) {
downloaded = false;
logger.error("FTP服务器异常", e);
} finally {
logout(sftp);
}
logger.info("SftpUtils download end");
return downloaded;
}
SFTP删除文件
下面展示一些 内联代码片
。
/**
* 删除文件
* directory 要删除文件所在目录
* deleteFile 要删除的文件
*/
public static boolean delete(String host, int port, String username, String password, String filePath){
logger.info("SftpUtils delete begin");
boolean success = true;
ChannelSftp sftp = null;
try {
sftp = login(host, port, username, password);
String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));
sftp.cd(directory);
String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);
sftp.rm(fileName);
} catch (SftpException e) {
logger.error("文件删除失败", e);
success = false;
} finally {
logout(sftp);
}
logger.info("SftpUtils delete end");
return success;
}
列出目录下的文件
下面展示一些 内联代码片
。
/**
* 列出目录下的文件
* directory 要列出的目录
* sftp
*/
public static boolean isFileExist(String host, int port, String username, String password, String filePath) {
boolean success = false;
ChannelSftp sftp = null;
try {
sftp = login(host, port, username, password);
String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);
Vector<?> vector = sftp.ls(directory);
for (Object obj : vector) {
if (obj != null) {
LsEntry lsEntry = (LsEntry) obj;
if (fileName.equals(lsEntry.getFilename())) {
success = true;
break;
}
}
}
} catch (Exception e) {
logger.error("sftp服务器异常");
} finally {
logout(sftp);
}
return success;
}
最终 SFTPUtils工具类
import com.jcraft.jsch.*;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Base64Utils;
import org.springframework.util.StringUtils;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
import java.util.Vector;
/**
* @author Administrator
*
*/
public class SFTPUtils {
private final static Logger logger = LoggerFactory.getLogger(SFTPUtils.class);
protected final static int CLIENT_TIMEOUT = 1000 * 180;
/**
* 连接sftp服务器
*/
public static ChannelSftp login(String host, int port, String username, String password) {
logger.info("SftpUtils login begin");
Session session = null;
String config = "Port "+port+"\n" +
"\n" +
"Host foo\n" +
" User "+username+"\n" +
" Hostname "+host+"\n" +
"Host *\n" +
" ConnectTime 3000\n" +
" PerferredAuthentications Keyboard-interact,password,publicKey\n" +
" #ForwardAgent yes\n" +
" #StrictHostKeyChecking no\n" +
" #identiyFile ~/.ssh/id_rsa\n" +
" #UserKnownHostFile ~/.shh/known_hosts";
ConfigRepository configRepository = null;
try {
configRepository = OpenSSHConfig.parse(config);
JSch jSch = new JSch();
jSch.setConfigRepository(configRepository);
//"foo" is from "Host foo" in the above config
session = jSch.getSession("foo");
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect(18000);
Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftp = (ChannelSftp) channel;
logger.info("SftpUtils login end");
return sftp;
} catch (JSchException | IOException e) {
logger.error("连接SFTP服务器失败", e);
return null;
}
}
/**
* 关闭连接 server
*/
public static void logout(ChannelSftp sftp){
logger.info("SftpUtils logout begin");
if (sftp != null) {
Session session = null;
try {
session = sftp.getSession();
if (sftp.isConnected()) {
sftp.disconnect();
}
} catch (JSchException e) {
logger.error("获取session失败", e);
} finally {
if (session != null) {
session.disconnect();
}
}
}
logger.info("SftpUtils logout end");
}
/**
* 将输入流的数据上传到sftp作为文件。文件完整路径=basePath+directory
* basePath 服务器的基础路径
* directory 上传到该目录
* sftpFileName sftp端文件名
* in 输入流
*/
public static boolean upload(String host, int port, String username, String password, String basePath, String sftpFileName, InputStream input) {
logger.info("SftpUtils upload begin");
boolean success = true;
ChannelSftp sftp = login(host, port, username, password);
try {
sftp.cd(basePath);
} catch (SftpException e) {
//目录不存在,则创建文件夹
String [] dirs = basePath.split("/");
String tempPath = "";
for(String dir:dirs){
if(null== dir || "".equals(dir)) {
continue;
}
tempPath+="/"+dir;
try {
sftp.cd(tempPath);
} catch (SftpException e1) {
try {
sftp.mkdir(tempPath);
sftp.cd(tempPath);
} catch (SftpException e2) {
logger.error("创建文件夹失败", e2);
//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("创建文件夹失败"));
}
}
try{
sftp.cd(tempPath);
}catch(SftpException e1){
logger.error("SFTP服务器异常", e1);
//throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("SFTP服务器异常"));
}
}
}
try {
//上传文件
sftp.put(input, sftpFileName);
} catch (SftpException e) {
// TODO Auto-generated catch block
logger.error("上传文件失败", e);
// throw new BusinessException(ExceptionEnum.EXECUTE_RUNTIME_EXCP.setExceptionMsg("上传文件失败"));
success = false;
} finally {
logout(sftp);
}
logger.info("SftpUtils upload end");
return success;
}
/**
* 下载文件。
* directory 下载目录
* downloadFile 下载的文件
* saveFile 存在本地的路径
*/
public static boolean download(String host, int port, String username, String password, String filePath, final OutputStream outputStream) {
logger.info("SftpUtils download begin");
boolean downloaded = true;
ChannelSftp sftp = login(host, port, username, password);
String fileName = null;
try {
if (filePath != null && !"".equals(filePath)) {
String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));
sftp.cd(directory);
}
fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);
sftp.get(fileName, outputStream);
} catch (SftpException e) {
downloaded = false;
logger.error("FTP服务器异常", e);
} finally {
logout(sftp);
}
logger.info("SftpUtils download end");
return downloaded;
}
/**
* 删除文件
* directory 要删除文件所在目录
* deleteFile 要删除的文件
*/
public static boolean delete(String host, int port, String username, String password, String filePath){
logger.info("SftpUtils delete begin");
boolean success = true;
ChannelSftp sftp = null;
try {
sftp = login(host, port, username, password);
String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));
sftp.cd(directory);
String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);
sftp.rm(fileName);
} catch (SftpException e) {
logger.error("文件删除失败", e);
success = false;
} finally {
logout(sftp);
}
logger.info("SftpUtils delete end");
return success;
}
/**
* 列出目录下的文件
* directory 要列出的目录
* sftp
*/
public static boolean isFileExist(String host, int port, String username, String password, String filePath) {
boolean success = false;
ChannelSftp sftp = null;
try {
sftp = login(host, port, username, password);
String directory = filePath.substring(0, filePath.lastIndexOf(File.separator));
String fileName = filePath.substring(filePath.lastIndexOf(File.separator) + 1);
Vector<?> vector = sftp.ls(directory);
for (Object obj : vector) {
if (obj != null) {
LsEntry lsEntry = (LsEntry) obj;
if (fileName.equals(lsEntry.getFilename())) {
success = true;
break;
}
}
}
} catch (Exception e) {
logger.error("sftp服务器异常");
} finally {
logout(sftp);
}
return success;
}
}
业务类ImportSourceController
package org.apache.dolphinscheduler.api.controller;
import org.apache.dolphinscheduler.api.utils.SFTPUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.*;
import java.io.*;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* data source controller
*/
@RestController
@RequestMapping("importSource")
public class ImportSourceController extends BaseController {
private static final Logger logger = LoggerFactory.getLogger(ImportSourceController.class);
/**
* sftp获取上传暂存文件
* @param uploadFile 上传的文件路径
* @param sftpFileName 存放的文件名称
* @return
* @throws SQLException
*/
@PostMapping("/getHeadBack")
@ResponseBody
public List<String> getHeadBack(
@RequestParam("uploadFile") String uploadFile
,@RequestParam("sftpFileName") String sftpFileName) throws FileNotFoundException {
List<String> headlist = new ArrayList<String>();
InputStream input = new InputStream() {
@Override
public int read() throws IOException {
return 0;
}
};
File file = new File(uploadFile);
String host = "192.168.1.92";
String port = "22";
String username = "root";
String password = "rootroot";
String basePath = "/opt/testSFTP/";
//String sftpFileName = "wx";
//上传文件
SFTPUtils.upload(host,Integer.valueOf(port),username,password,basePath,sftpFileName,new FileInputStream(file));
return headlist;
}
}