写个功能要从ftp服务下载文件,在本地的ftp服务一切ok( Mac 10.15.5 环境),但是在Linux容器环境发现不管切换到哪个目录,获取什么文件,调用FTPClient.listFiles()方法时返回的始终为空,但是代码又运行正常没有异常抛出。然后断点ftp.getReplyCode()也返回230登陆成功.
解决的方法很简单,
在调用FTPClient.listFiles()方法前,先调用FTPClient.enterLocalPassiveMode();就可以了。
/**
* 下载文件 *
*
* @param pathname FTP服务器文件目录 *
* @param filename 文件名称 *
* @param localpath 下载后的文件路径 *
* @return 下载的文件File
*/
public File downloadFileGetFile(String pathname, String filename, String localpath) {
boolean flag = false;
OutputStream os = null;
File outPutFile = null;
try {
System.out.println("FTP开始下载文件");
initFtpClient();
//切换FTP目录
ftpClient.changeWorkingDirectory(pathname);
System.out.println("改变ftp服务器路径:" + pathname);
ftpClient.enterLocalPassiveMode(); // Use passive mode as default
FTPFile[] ftpFiles = ftpClient.listFiles();
for (FTPFile file : ftpFiles) {
if (filename.equalsIgnoreCase(file.getName())) {
File localFile = new File(localpath + "/" + file.getName());
os = new FileOutputStream(localFile);
ftpClient.retrieveFile(file.getName(), os);
os.close();
outPutFile = localFile;
} else {
System.out.println("ftp服务器上文件:" + file.getName() +"寻找的fileName:" + filename);
}
}
ftpClient.logout();
flag = true;
System.out.println("FTP下载文件成功");
} catch (Exception e) {
System.out.println("FTP下载文件失败");
e.printStackTrace();
} finally {
if (ftpClient.isConnected()) {
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != os) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return outPutFile;
}
这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。
为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现获取不了文件目录的情况。
亲测可用
网友评论