美文网首页
Java FTPClient.listFiles()不能获取目录

Java FTPClient.listFiles()不能获取目录

作者: 多喝热开水 | 来源:发表于2020-07-14 16:12 被阅读0次

写个功能要从ftp服务下载文件,在本地的ftp服务一切ok( Mac 10.15.5 环境),但是在Linux容器环境发现不管切换到哪个目录,获取什么文件,调用FTPClient.listFiles()方法时返回的始终为空,但是代码又运行正常没有异常抛出。然后断点ftp.getReplyCode()也返回230登陆成功.

解决的方法很简单,

在调用FTPClient.listFiles()方法前,先调用FTPClient.enterLocalPassiveMode();就可以了。

/**
     * 下载文件 *
     *
     * @param pathname  FTP服务器文件目录 *
     * @param filename  文件名称 *
     * @param localpath 下载后的文件路径 *
     * @return  下载的文件File
     */
    public File downloadFileGetFile(String pathname, String filename, String localpath) {
        boolean flag = false;
        OutputStream os = null;
        File outPutFile = null;
        try {
            System.out.println("FTP开始下载文件");
            initFtpClient();
            //切换FTP目录
            ftpClient.changeWorkingDirectory(pathname);
            System.out.println("改变ftp服务器路径:" + pathname);
            ftpClient.enterLocalPassiveMode(); // Use passive mode as default
            FTPFile[] ftpFiles = ftpClient.listFiles();
            for (FTPFile file : ftpFiles) {
                if (filename.equalsIgnoreCase(file.getName())) {
                    File localFile = new File(localpath + "/" + file.getName());
                    os = new FileOutputStream(localFile);
                    ftpClient.retrieveFile(file.getName(), os);
                    os.close();
                    outPutFile = localFile;
                } else {
                    System.out.println("ftp服务器上文件:" + file.getName() +"寻找的fileName:" + filename);
                }
            }
            ftpClient.logout();
            flag = true;
            System.out.println("FTP下载文件成功");
        } catch (Exception e) {
            System.out.println("FTP下载文件失败");
            e.printStackTrace();
        } finally {
            if (ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != os) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return outPutFile;
    }

这个方法的意思就是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。

为什么要这样做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上,由于安全限制,可能某些端口没有开启,所以就出现获取不了文件目录的情况。
亲测可用

相关文章

网友评论

      本文标题:Java FTPClient.listFiles()不能获取目录

      本文链接:https://www.haomeiwen.com/subject/pxrfhktx.html