FTPSClient解决无法获取文件问题(listFiles为空)

前言

最近需要去第三方拉取数据报告,某个邮件的第三方采用的是ftp存取csv文件,故项目中需要使用ftp,但遇到了一些坑,特此记录一下

环境

<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>

问题

无法正确连接问题

最开始,使用如下获取连接

            FTPClient ftpClient = new FTPSClient();
            // 连接FTP服务器
            ftpClient.connect(ftpHost, ftpPort);
            // 登陆FTP服务器
            ftpClient.login(ftpUserName, ftpPassword);
            
            ftpClient.type(FTP.BINARY_FILE_TYPE);
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                logger.error("未连接到FTP,用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                logger.info("FTP连接成功。");
            }

但每次到了
FTPReply.isPositiveCompletion(ftpClient.getReplyCode())
这一步时,总是连接失败。后来才观察到,我需要连接的是一个ftps服务器,
故以上代码需要更改为如下:

            FTPSClient ftpClient = new FTPSClient();
            // 连接FTP服务器
            ftpClient.connect(ftpHost, ftpPort);
            // 登陆FTP服务器
            ftpClient.login(ftpUserName, ftpPassword);
            
            ftpClient.type(FTP.BINARY_FILE_TYPE);
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                logger.error("未连接到FTP,用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                logger.info("FTP连接成功。");
            }

FTP/FTPS/SFTP区别

无法正确获取文件问题

解决了上述问题后,终于能够正常连接,但在获取文件的时候,每次都是获取的null,然后试探性的调用了一下ftpClient.listFiles()结果是个空数组
[外链图片转存失败(img-Jt1klP9M-1568796327259)(CF7EFB75235C45CBA7E8CA8E56EB4394)]
而且根本无法点开
首先查到说是ftp主动被动模式有关,然后我在连接上加了一句
ftpClient.enterLocalPassiveMode();
改成了被动模式,但是仍然不生效,后面在stackoverflow上看到了一个同样的问题,提示需要加上这一段

            ftpClient.execPBSZ(0);
            ftpClient.execPROT("P");
            ftpClient.type(FTP.BINARY_FILE_TYPE);

问题完美解决,原因暂时没去深究。希望有大佬来解答一下。
有遇到同样问题的小伙伴可以使用试试看

代码

完整获取ftpsClient的方法

  /**
     * 获取FTPClient对象
     * @param ftpHost       FTP主机服务器
     * @param ftpPassword   FTP 登录密码
     * @param ftpUserName   FTP登录用户名
     * @param ftpPort       FTP端口 默认为21
     * @return
     */
    public static FTPSClient getFTPClient(String ftpHost, String ftpUserName, String ftpPassword, int ftpPort) {
        try {
            FTPSClient ftpClient = new FTPSClient();
            // 连接FTP服务器
            ftpClient.connect(ftpHost, ftpPort);
            ftpClient.enterLocalPassiveMode();
            // 登陆FTP服务器
            ftpClient.login(ftpUserName, ftpPassword);
            ftpClient.execPBSZ(0);
            ftpClient.execPROT("P");
            ftpClient.type(FTP.BINARY_FILE_TYPE);
            if (!FTPReply.isPositiveCompletion(ftpClient.getReplyCode())) {
                System.err.println("未连接到FTP,用户名或密码错误。");
                ftpClient.disconnect();
            } else {
                logger.info("FTP连接成功。");
            }
            return ftpClient;
        } catch (SocketException e) {
            System.out.println("FTP的IP地址可能错误,请正确配置。");
        } catch (IOException e) {
            System.err.println("FTP的端口错误,请正确配置。");
        }
        return null;
    }
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值