【排坑】Ftp正常连接服务器但无法获取文件(四)

本文介绍了一个关于FTP连接的问题,即在使用FtpUtil工具类连接FTP服务器并检查文件存在性时,即使文件确实存在,也会错误地报告文件不存在。通过在登录前启用被动模式(ftpClient.enterLocalPassiveMode()),解决了这一问题。文章还分析了主动模式和被动模式在FTP连接中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ftp工具类 FtpUtil 中部分代码如下:

import org.apache.commons.net.ftp.*;

public class FtpUtil {
    
    private static Logger log = Logger.getLogger(FtpUtil.class);
    private FTPClient ftpClient;
    private FtpUtil(){}


    /**
     * @description 创建ftp连接实例
     */
    public static FtpUtil getInstance(String serverUrl, String port, String userName, String password) throws Exception{
        FtpUtil ftpUtil = new FtpUtil();
        ftpUtil.connectServer(serverUrl, port, userName, password);
        return ftpUtil;
    }

    /**
     * @description 创建连接
     */
    public void connectServer(String serverUrl, String port, String userName, String password) throws Exception {
        ftpClient = new FTPClient();
        log.debug("连接到ftp服务器:" + serverUrl);
        ftpClient.connect(serverUrl, Integer.parseInt(port));
        int reply = ftpClient.getReplyCode();
        log.debug("响应串为:" + ftpClient.getReplyString());
        if (!FTPReply.isPositiveCompletion(reply)) {
        	
            ftpClient.disconnect();
            log.info("连接ftp服务器失败");
            throw new Exception("连接ftp服务器失败");
        } else {
            ftpClient.login(userName, password);
            log.debug("当前工作目录为:" + ftpClient.printWorkingDirectory());
            log.debug("登录ftp服务器成功");
        }
    }

	/**
	 * 判断文件是否存在
	 */
	public Boolean isExistFileName(String pathFileName) throws ParseException {
          Boolean isExist=false;
          // 获得指定目录下所有文件名
          FTPFile[] ftpFiles = null;
          try {
              ftpFiles = ftpClient.listFiles(pathFileName);
          } catch (IOException e) {
              log.info("获取指定目录:"+pathFileName+"指定文件列表出现异常");
              e.printStackTrace();
          }
          if(ftpFiles!=null&&ftpFiles.length>0){
              isExist=true;
          }else{
              isExist=false;
          }
          return isExist;
	}
}
  • Service调用FtpUtil.getInstance方法,可以成功连接ftp服务器,且无异常错误。
  • Service调用FtpUtil.isExistFileName方法,提示指定不存在指定文件名的文件,且无异常错误。(经校验,文件存在且目录及文件名都是对的)

【解决】:在程序调用登录方法之前,即执行“FTPClient ftpClient = null;  ftpClient.login(username, password);”之前,加上一行代码:ftpClient.enterLocalPassiveMode();这样就可以了。

【分析】:

  1. 在FTP服务中,涉及到客户端和服务器端的连接,连接就会涉及到端口的打开问题;
  2. 而端口的打开中,又涉及到主动模式和被动模式。主动模式:客户端开放端口给服务端用;被动模式:服务端开放端口给客户端用。由于很多客户端在防火墙内,开放端口给服务器端用比较困难。所以用被动模式的时候比较多。
  3. 如果涉及到了内网、局域网等环境时,出现FTP连接问题,也可以考虑是否是因为连接模式引起的。

转载于:https://my.oschina.net/xiaohai945/blog/2962948

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值