public String getFtpFile() {
//构造登录FTP服务器配置
SftpUtil sftp = new SftpUtil("username", "D:"+ File.separator +"WeBank"+File.separator+"id_ras", null, "你的ip", 57000);
//获取前一天日期
String date = DateTimeFormatter.ofPattern("yyyyMMdd").format(LocalDateTime.now().plusDays(-1));
try {
//登录SFTP服务器
sftp.login();
String key = "/send/";
String value = "D:/WeBank/send/";
//ftpFilePath是sftp文件路径,localFilePath是保存到本地的路径
// String ftpFilePath = key.concat(date).concat("/").concat("EAST").concat("/");
String ftpFilePath = key.concat(date).concat("/");
String localFilePath = value.concat(date).concat("/");
Vector<ChannelSftp.LsEntry> vector = sftp.listFilesRemoveDir(ftpFilePath);
//判断是否有附件
if (vector != null) {
//如果有附件,下载前判断目录是否存在
File dir = new File(value.concat(date));
if (!dir.exists()) {
dir.mkdir();
}
//遍历附件信息,保存本地
vector.forEach(object -> {
//实例附件对象信息
//保存入库
if (object.getAttrs().isDir()) { //如果下面还有目录的话,继续下载子级目录下的文件
// System.out.println("是否为目录"+object.getAttrs().isDir()+"是的,目录为"+object.getFilename());
Vector<ChannelSftp.LsEntry> v = sftp.listFilesRemoveDir(ftpFilePath.concat(object.getFilename()).concat("/"));
v.forEach(ESAT -> {
sftp.download(
//sftp文件路径
ftpFilePath.concat(object.getFilename()).concat("/"),
//文件名称
ESAT.getFilename(),
//保存到本地的路径+附件名
localFilePath.concat(ESAT.getFilename()));
});
} else { //否则正常下载文件
sftp.download(
//sftp文件路径
ftpFilePath,
//文件名称
object.getFilename(),
//保存到本地的路径+附件名
localFilePath.concat(object.getFilename()));
}
});
}
sftp.logout();
return date + "期文件入库成功!";
} catch (Exception e) {
sftp.logout();
e.printStackTrace();
return date + "期文件入库失败!错误信息:" + e.getMessage();
}
}
/**
* 获取文件夹下的文件,判断删除上级目录跟根目录,避免数据的排序而错删文件
*
* @param directory 路径
* @return Vector
*/
public Vector<ChannelSftp.LsEntry> listFilesRemoveDir(String directory) {
try {
if (isDirExist(directory)) {
Vector<ChannelSftp.LsEntry> vector = sftp.ls(directory);
Vector<ChannelSftp.LsEntry> vectors = new Vector<>();
// //移除上级目录和根目录:"." ".."
vector.forEach(object -> {
if (!(".".equals(object.getFilename())) && !("..".equals(object.getFilename()))) {
vectors.add(object);
}
});
return vectors;
}
} catch (SftpException e) {
logger.error("获取文件夹信息异常!", e);
}
return null;
}
/**
* 下载文件
*
* @param directory SFTP服务器的文件路径
* @param downloadFile SFTP服务器上的文件名
* @param saveFile 保存到本地路径
*/
public void download(String directory, String downloadFile, String saveFile) {
try {
if (directory != null && !"".equals(directory)) {
sftp.cd(directory);
}
File file = new File(saveFile);
sftp.get(downloadFile, new FileOutputStream(file));
} catch (SftpException | FileNotFoundException e) {
logger.error("文件下载异常!", e);
}
}
图上的sftp 为ChannelSftp 实例,可自寻搜索实例化ChannelSftp 或者直接引入ChannelSftp 实例化配置你的服务器配置即可使用图上的方法。