第三方数据取不了现 FTPSClient解决无法获取文件问题(listFiles为空)
前言最近需要去第三方拉取数据报告,某个邮件的第三方采用的是ftp存取csv文件,故项目中需要使用ftp,但遇到了一些坑,特此记录一下环境问题 无法正确连接问题最开始
前言
最近需要去第三方拉取数据报告,某个邮件的第三方采用的是ftp存取csv文件,故项目中需要使用ftp,但遇到了一些坑,特此记录一下
环境
commons-net
commons-net
3.6
问题 无法正确连接问题
最开始,使用如下获取连接
FTPClient ftpClient = new FTPSClient();
// 连接FTP服务器
ftpClient.connect(ftpHost, ftpPort);
// 登陆FTP服务器
ftpClient.login(ftpUserName, ftpPassword);
ftpClient.type(FTP.BINARY_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.error("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
logger.info("FTP连接成功。");
}
但每次到了
.(.())
这一步时,总是连接失败。后来才观察到,我需要连接的是一个ftps服务器,
故以上代码需要更改为如下:
FTPSClient ftpClient = new FTPSClient();
// 连接FTP服务器
ftpClient.connect(ftpHost, ftpPort);
// 登陆FTP服务器
ftpClient.login(ftpUserName, ftpPassword);
ftpClient.type(FTP.BINARY_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
logger.error("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
logger.info("FTP连接成功。");
}
FTP/FTPS/SFTP区别
无法正确获取文件问题
解决了上述问题后,终于能够正常连接,但在获取文件的时候,每次都是获取的null,然后试探性的调用了一下.()结果是个空数组
而且根本无法点开
首先查到说是ftp主动被动模式有关,然后我在连接上加了一句
.e();
改成了被动模式,但是仍然不生效,后面在上看到了一个同样的问题,提示需要加上这一段
ftpClient.execPBSZ(0);
ftpClient.execPROT("P");
ftpClient.type(FTP.BINARY_FILE_TYPE);
问题完美解决,原因暂时没去深究。希望有大佬来解答一下。
有遇到同样问题的小伙伴可以使用试试看
代码
完整获取的方法
/**
* 获取FTPClient对象
* @param ftpHost FTP主机服务器
* @param ftpPassword FTP 登录密码
* @param ftpUserName FTP登录用户名
* @param ftpPort FTP端口 默认为21
* @return
*/
public static FTPSClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
try {
FTPSClient ftpClient = new FTPSClient();
// 连接FTP服务器
ftpClient.connect(ftpHost, ftpPort);
ftpClient.enterLocalPassiveMode();
// 登陆FTP服务器
ftpClient.login(ftpUserName, ftpPassword);
ftpClient.execPBSZ(0);
ftpClient.execPROT("P");
ftpClient.type(FTP.BINARY_FILE_TYPE);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
System.err.println("未连接到FTP,用户名或密码错误。");
ftpClient.disconnect();
} else {
logger.info("FTP连接成功。");
}
return ftpClient;
} catch (SocketException e) {
System.out.println("FTP的IP地址可能错误,请正确配置。");
} catch (IOException e) {
System.err.println("FTP的端口错误,请正确配置。");
}
return null;
}