下载ftp服务器文件
public StringBuilder downLoadFTPFile(String hostName,int port,String userName,String password,String remotePath,String fileName){
InputStream is = null;
BufferedReader br = null;
try {
//连接ftp服务器
ftpClient.connect(hostName,21);
ftpClient.login(userName,password);
if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
ftpClient.disconnect();
System.out.println("连接失败,失败code是:" + ftpClient.getReplyCode() + "\n失败描述是:" + ftpClient.getReplyString());
}
//设置服务器下的文件路径。
boolean hasRemote = ftpClient.changeWorkingDirectory(remotePath);
if (!hasRemote){
System.out.println("进入ftp目录失败。");
}
System.out.println("-----hostName:" + hostName + "---userName:" + userName + "---password" + password
+ "---remotePath:" + remotePath + "---fileName:" + fileName);
//获取文件输入流
is = ftpClient.retrieveFileStream(fileName);
System.out.println("文件输入流是:"+ is);
br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
String line;
while ((line = br.readLine()) != null){
//读取数据
sbResult.append(line + "\n");
System.out.println("每一行的数据内容是:" + sbResult);
}
ftpClient.logout();
} catch (IOException e) {
e.printStackTrace();
System.out.println("连接门户ftp获取文件失败,失败原因:" + e.getMessage());
}finally {
if (ftpClient.isConnected()){
try {
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
if (br != null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
pom文件中添加
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
解析的时候可以按行截取。
好了本来到这里已经结束了,连自己的阿里云服务器是没有什么问题的。
但是上了公司的测试服务器以后(因为调的是其他厂家的ftp服务,所以可能跟自己的云服务器配置不一样。),一直报ftp response 421 server close connect。
各种查问题,各种找资料,我尝试直接在虚机使用
ftp ip + 端口
命令去直接获取文件
get 文件名称
可以拿到,获取到的是二进制的数据
然后就想到了把获取文件设置为二进制。
代码如下
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
结果还是不行。
然后网上查需要设置成被动模式
代码如下
ftpClient.enterLocalPassiveMode();
然后还是不行,这下就陷入了沉思,死活通不了。这么个破东西搞了一个多礼拜。最后发现原因是因为我是在连接登录前设置的二进制文件,最后放到连接和登录之后就好了。简直要气炸。故记录一下,有时间去看源码为什么回这样。
ftpClient.connect(hostName,port);
ftpClient.login(userName,password);