导入依赖
<!-- FTP工具类 -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
<!-- jcraft操作SFTP工具类-->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
书写配置文件
sftp:
hostname: 1
port: 1
username: 1
password: 1
封装工具类和配置文件
配置文件
/**
* fstp配置
*/
@Data
@ConfigurationProperties(prefix = "sftp")
@Configuration
public class SftpConfig {
private String hostname;
private Integer port;
private String username;
private String password;
}
工具类封装
@Component
public class FTPSFTPClient {
@Resource
private SftpConfig sftpConfig;
/**
* 下载单个文件
* @param isSftp 是否是sftp
* @param remoteFile 文件路径
* @return
*/
public byte[] downloadFile(boolean isSftp ,String remoteFile) {
String server = sftpConfig.getHostname();
int port = sftpConfig.getPort();
String user = sftpConfig.getUsername();
String password = sftpConfig.getPassword();
if (isSftp) {
try {
return downLoadFileSFTP(server, port, user, password, remoteFile);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("文件下载失败");
}
} else {
try {
return downloadFileFTP(server, port, user, password, remoteFile);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException("文件下载失败");
}
}
}
/**
* 下载多个文件
* @param remoteDirectory 文件夹路径
* @param isSftp 是否是sftp
* @return
* @throws Exception
*/
public Map<String, byte[]> downloadDirectory( String remoteDirectory, boolean isSftp) throws Exception {
String server = sftpConfig.getHostname();
int port = sftpConfig.getPort();
String user = sftpConfig.getUsername();
String password = sftpConfig.getPassword();
if (isSftp) {
return downLoadDirectorySFTP(server, port, user, password, remoteDirectory);
} else {
return downLoadDirectoryFTP(server, port, user, password, remoteDirectory);
}
}
private byte[] downloadFileFTP(String server, int port, String user, String password, String remoteFile) throws IOException {
FTPClient ftpClient = new FTPClient();
ftpClient.connect(server, port);
ftpClient.login(user, password);
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
throw new RuntimeException("Exception in connecting to FTP Server");
}
InputStream inputStream = ftpClient.retrieveFileStream(remoteFile);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > 0) {
byteArrayOutputStream.write(buffer, 0, len);
}
inputStream.close();
ftpClient.logout();
ftpClient.disconnect();
return byteArrayOutputStream.toByteArray();
}
private byte[] downLoadFileSFTP(String server, int port, String user, String password, String remoteFile) throws Exception {
JSch jsch = new JSch();
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
session = jsch.getSession(user, server, port);
session.setPassword(password);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
InputStream inputStream = channelSftp.get(remoteFile);
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > 0) {
byteArrayOutputStream.write(buffer, 0, len);
}
inputStream.close();
channelSftp.exit();
session.disconnect();
return byteArrayOutputStream.toByteArray();
}
private Map<String, byte[]> downLoadDirectoryFTP(String server, int port, String user, String password, String remoteDirectory) throws IOException {
FTPClient ftpClient = new FTPClient();
ftpClient.connect(server, port);
ftpClient.login(user, password);
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
throw new RuntimeException("Exception in connecting to FTP Server");
}
Map<String, byte[]> files = new HashMap<>();
FTPFile[] ftpFiles = ftpClient.listFiles(remoteDirectory);
for (FTPFile ftpFile : ftpFiles) {
if (ftpFile.isFile()) {
InputStream inputStream = ftpClient.retrieveFileStream(remoteDirectory + "/" + ftpFile.getName());
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > 0) {
byteArrayOutputStream.write(buffer, 0, len);
}
inputStream.close();
files.put(ftpFile.getName(), byteArrayOutputStream.toByteArray());
} else if (ftpFile.isDirectory()) {
files.putAll(downLoadDirectoryFTP(server, port, user, password, remoteDirectory + "/" + ftpFile.getName()));
}
}
ftpClient.logout();
ftpClient.disconnect();
return files;
}
private Map<String, byte[]> downLoadDirectorySFTP(String server, int port, String user, String password, String remoteDirectory) throws Exception {
JSch jsch = new JSch();
Session session = null;
Channel channel = null;
ChannelSftp channelSftp = null;
session = jsch.getSession(user, server, port);
session.setPassword(password);
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
channel = session.openChannel("sftp");
channel.connect();
channelSftp = (ChannelSftp) channel;
Map<String, byte[]> files = new HashMap<>();
Vector<ChannelSftp.LsEntry> list = channelSftp.ls(remoteDirectory);
for (ChannelSftp.LsEntry entry : list) {
if (!entry.getAttrs().isDir()) {
InputStream inputStream = channelSftp.get(remoteDirectory + "/" + entry.getFilename());
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > 0) {
byteArrayOutputStream.write(buffer, 0, len);
}
inputStream.close();
files.put(entry.getFilename(), byteArrayOutputStream.toByteArray());
} else if (!".".equals(entry.getFilename()) && !"..".equals(entry.getFilename())) {
files.putAll(downLoadDirectorySFTP(server, port, user, password, remoteDirectory + "/" + entry.getFilename()));
}
}
channelSftp.exit();
session.disconnect();
return files;
}
}