写个功能要从ftp服务下载文件,在本地的ftp服务一切ok(window环境),可是在Linux环境发现无论切换到哪一个目录,获取什么文件,调用FTPClient.listFiles()方法时返回的始终为空,可是代码又运行正常没有异常抛出。而后断点ftp.getReplyCode()也返回230登录成功.linux
解决的方很简单,安全
在调用FTPClient.listFiles()方法前,先调用FTPClient.enterLocalPassiveMode();就能够了。服务器
/**
* 从FTP服务器上下载文件
* @param ftpDirectoryAndFileName ftp服务器文件路径,以/dir形式开始
* @param localDirectoryAndFileName 保存到本地的目录
* @return
*/
public boolean get(String ftpDirectoryAndFileName, String localDirectoryAndFileName) {
File file=new File(localDirectoryAndFileName);
if (!file.exists())file.mkdirs();
if (!ftpClient.isConnected()) {
return false;
}
ftpClient.enterLocalPassiveMode(); // Use passive mode as default
try {
// 将路径中的斜杠统一
char[] chars = ftpDirectoryAndFileName.toCharArray();
StringBuffer sbStr = new StringBuffer(256);
for (int i = 0; i < chars.length; i++) {
if ('\\' == chars[i]) {
sbStr.append('/');
} else {
sbStr.append(chars[i]);
}
}
ftpDirectoryAndFileName = sbStr.toString();
String filePath = ftpDirectoryAndFileName.substring(0, ftpDirectoryAndFileName.lastIndexOf("/"));
String fileName = ftpDirectoryAndFileName.substring(ftpDirectoryAndFileName.lastIndexOf("/") + 1);
this.changeDir(filePath);
ftpClient.retrieveFile(new String(fileName.getBytes(), "iso-8859-1"),
new FileOutputStream(localDirectoryAndFileName)); // download
// file
System.out.println(ftpClient.getReplyString()); // check result
System.out.println("线程"+Thread.currentThread().getName()+"从ftp服务器上下载文件:" + ftpDirectoryAndFileName + ", 保存到:" + localDirectoryAndFileName);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}app
调用FTPClient.enterLocalPassiveMode();这个方法的意思就是每次数据链接以前,ftp client告诉ftp server开通一个端口来传输数据。为何要这样作呢,由于ftp server可能每次开启不一样的端口来传输数据,可是在linux上,因为安全限制,可能某些端口没有开启,因此就出现阻塞。
---------------------
做者:是饭七分饱
来源:CSDN
原文:https://blog.csdn.net/hu15903314850/article/details/79887604
版权声明:本文为博主原创文章,转载请附上博文连接!this