问题描述
连接上FTP服务器之后,从指定文件夹读取文件,在本地测试的时候可以正常读取,但是打包到测试执行之后就无法正常读取。
本地测试的时候的FTP服务器的配置与线上的配置一样(IP、端口、用户名、密码),这些都是一样的,连测试的时候读取的文件也是一样的。在对同一个文件夹下的文件进行读取时,本地获取到这个文件夹下文件数是65,但是在测试环境读取到却是0。
代码大概是这样的:
public void downFile(String ftpHost, int port, String username, String password,
String remotePath) {
FTPClient ftp = new FTPClient();
try {
ftp.connect(ftpHost, port);
ftp.login(username, password); // 登录
if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) {
ftp.disconnect();
throw new RuntimeException("下载文件失败!");
}
ftp.enterLocalPassiveMode(); // 被动模式
ftp.changeWorkingDirectory(remotePath); // 转移到FTP服务器目录
FTPFile[] fs = ftp.listFiles();
log.info("读取文件数量:" + fs.length);
// 以下代码省略
}
原因与解决方式
在进行多方面排查之后都没有发现问题,直到最后想起来会不会和FTP的主动模式和被动模式有关的时候,找到了问题。
我配置的FTP服务器是被动模式,FTPClient
默认使用主动模式连接,我最开始是没有设置ftp.enterLocalPassiveMode(); // 被动模式
的。
之所以没有设置被动模式连接,是因为之前在其他地方测试过,如果FTP服务器是主动模式,在连接的时候没有指定主动模式连接就会超时,但是如果FTP服务器是被动模式,在连接的时候就可以不指定连接模式。所以不知道是怎么回事。
总之,连接FTP的时候最好显式指定工作模式,无论是主动模式还是被动模式,如果遇到FTP服务器相关问题可以尝试设置连接模式来解决。