前几天使用org.apache.commons.net.ftp.FTP实现定时从远程服务器上上传下载文件,按照网上大家提供的方法碰到不同的ftp服务器有时工作不正常。
看看下面红色的文件,可能会对你的相关工作带来方便:
-------------------------------------------------------------------------------------------------------------
try {
ftpClient.connect(server, port);
ftpClient.setControlEncoding("utf8");// 设置字符集,可能会帮助你解决远程服务器上中文文件名的问题
if (ftpClient.login(user, password)) {
ftpClient.setFileType(FTP.BINARY_FILE_TYPE设置传输文件类型
ftpClient.enterLocalPassiveMode();//设置文件传输模式);//
if (remoteDir.length() != 0) {
//切换到服务器当前目录,此目录是ftp的当前绝对路径
ftpClient.changeWorkingDirectory(remoteDir);
}
} else {
System.out.println("链接异常");
}
} catch (Exception e) {
System.out.println("初始化链接出现问题");
e.printStackTrace();
return false;
}
-------------------------------------------------------------------------------------------------------------
FTPFile[] ftpFiles = ftpClient.listFiles(path);//此处的path是一个相对路径
ftpClient.enterLocalPassiveMode();//不加上这句,碰到有些ftp服务器还真的不能列取服务器上的文件名. 而且提示你connection reset。
for (FTPFile ftpFile : ftpFiles) {
System.out.println("filename:" + ftpFile.getName());
}
------------------------------------------------------------------------------------------------------------
public boolean download(String remoteFileName, String localFileName, int count) throws IOException {
if (count >= 3) {
return false;
}
boolean flag = false;
BufferedOutputStream buffOut = null;
try {
buffOut = new BufferedOutputStream(new FileOutputStream(localFileName));
ftpClient.setBufferSize(1024);
//注意这个remoteFileName,假如你当前登陆ftp的绝对路径是/home/test/ftplog , 并且你想下载result下面的test.log文件,那么你这个remoteFileName=result/test.log。 如此,删除远程ftp服务器的文件时,也必须是这样的。
flag = ftpClient.retrieveFile(remoteFileName, buffOut);
if (flag == false) {
flag = download(remoteFileName, localFileName, ++count);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
buffOut.close();
}
return flag;
}
---------------------------------------------------------------------------------------------------------