无法从FTP服务器下载文件

时间:2015-01-22 13:36:37

标签: java shell ftp

我创建了从FTP服务器下载文件的Java功能。它可以在我的本地机器上正常工作。但我需要在linux服务器下运行它(意味着另一个主机和端口)。并且该函数给出了错误

The collection, array, map, iterator, or enumeration portion of a for statement cannot be null

在代码行中出现:

for(String f : ftpNames) {
    ftpclient.retrieveFile(f, os); // os is OutputStream
}

所以它没有看到文件...... 我添加了

ftpclient.enterRemotePassiveMode();

ftpclient.getPassiveHost()返回227 Entering Passive Mode (x,x,x,x,204,15)

尝试通过 shell 列出并下载它们 - 它有效。

我应该如何修改代码来解决问题?感谢。

UPD 即可。我从FTP服务器获取日志我试图从中获取文件,并且有这样的字符串:

 425 Cannot open data connection

完整代码:

static boolean ftpFilesDownload(String ip, int port, String login, String passwd, String ftpdir, String localdir) throws IOException {
        Boolean result = false;

        FTPClient client = new FTPClient();
        String separator = File.separator;


        try {                             
            client.connect(ip, port);    
            System.out.println(client.getReplyString());
            client.login(login, passwd);
            System.out.println(client.getReplyString());

            client.setControlKeepAliveTimeout(1000*60*5);
            client.setControlKeepAliveReplyTimeout(1000*60*5);
            client.setFileType(FTP.BINARY_FILE_TYPE);
            System.out.println("client setFileType success");    

            client.changeWorkingDirectory(ftpdir);
            System.out.println(client.getReplyString());
            client.printWorkingDirectory();
            System.out.println("directory changed");                                 

            FTPFile[] ftpFiles = client.listFiles();
            System.out.println(ftpFiles);                          

            String[] ftpNames = client.listNames();
            System.out.println("the files are " + Arrays.toString(ftpNames)); // so null here...
              for(String f : ftpNames) {                
            String localfile = localdir + f;
            OutputStream os = new FileOutputStream(localfile);
            try  {
                result = client.retrieveFile(f, os);
                System.out.println("DOWNLOADING STARTED);
                System.out.println(client.getReplyString());
                client.noop();
            }
            catch(Exception e) {
                System.out.println(e);                    
                result = false;
            }
            finally {
                if(os != null)
                    os.close();
                }
            }
            client.logout();
            System.out.println(client.getReplyString());
        }
        catch(Exception e)
        {
            System.out.println(e);
            result = false;
        }
        finally
        {
            try
            {
                client.disconnect();
            }
            catch(Exception e)
            {
                System.out.println(e);
                result = false;
            }
        }
        return result;
    }

2 个答案:

答案 0 :(得分:0)

正如错误消息所解释的那样,您正在尝试迭代null对象。你应该检查一下(或确保使用空的Iterable)

如果这是一个execptional(错误)状态,我会明确地检查它并抛出某种运行时异常,例如:

if (ftpNames == null) {
    throw new IllegalArgumentException("Cannot use a null set of FTP servers");
}

for (String f : ftpNames) {
    ftpclient.retrieveFile(f, os); // os is OutputStream
}

或者你可以尝试继续没有FTP服务器,但似乎有点无意义。

答案 1 :(得分:-1)

尝试使用 ftpclient.enterLocalActiveMode();