标签:
/**
* Description: 从FTP服务器下载文件
* @param url FTP服务器hostname
* @param port FTP服务器端口
* @param username FTP登录账号
* @param password FTP登录密码
* @param remotePath FTP服务器上的相对路径
* @param fileName 要下载的文件名
* @param localPath 下载后保存到本地的路径
* @return
*/
public static boolean downFile(String ip, int port,String username, String password, String remotePath,String fileName,String localPath) {
boolean success = false;
FTPClient ftpc = new FTPClient();
try {
logger.info("连接ftp----");
int reply;
ftpc.connect(ip,port);
logger.info("--------------连接ftp成功--------------");
//如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftpc.login(username, password);//登录
reply = ftpc.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpc.disconnect();
return success;
}
//
logger.info("登录ftp成功!!!!!!!!!!!!!!");
ftpc.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
ftpc.enterLocalPassiveMode(); //设置被动模式
logger.info("切换路径:"+remotePath);
FTPFile[] fs = ftpc.listFiles();
logger.info("文件数量1:"+fs.length);
for(FTPFile ff:fs){
logger.info("文件名称:"+ff.getName());
if(ff.getName().equals(fileName)){
File localFile = new File(localPath+"/"+ff.getName());
OutputStream is = new FileOutputStream(localFile);
ftpc.retrieveFile(ff.getName(), is);
is.close();
logger.info("下载完毕----");
}
}
ftpc.logout();
success = true;
} catch (IOException e) {
//e.printStackTrace();
logger.error("ftp下载报错", e);
} finally {
if (ftpc.isConnected()) {
try {
ftpc.disconnect();
} catch (IOException ioe) {
}
}
}
return success;
}
如上代码,ftp上传下载其实很简单,但是有时候相信有的人很困惑,为什么服务器上的路径是对的,反而上传或者下载文件都是失败的或者获取为空。
这是因为ftp的ip的问题,如果ip没有经过防火墙的路由,我们上传下载,直接不需要设置,因为ftpclient默认为主动模式,客户端主动向服务器端发起申请。
但是如果ip穿过防火墙,经过路由了,这时候我们需要注意了,我们再去使用默认下载或者上传,会发生问题。这时候我们需要使用被动模式了。
enterLocalPassiveMode:设置客户端PASV模式
static int PASSIVE_LOCAL_DATA_CONNECTION_MODE
enterLocalActiveMode:设置客户端PORT模式
static int ACTIVE_LOCAL_DATA_CONNECTION_MODE
FTP传输有两种模式:主动模式(PORT)和被动模式(PASV)
标签:
原文地址:http://www.cnblogs.com/shunxiyuan/p/5413420.html