【问题标题】:Apache Commons FTPClient.listFilesApache Commons FTPClient.listFiles
【发布时间】:2011-01-21 08:14:28
【问题描述】:

我在我的一个应用程序中使用org.apache.commons.net.ftp.FTPClient 来使用 FTP 服务器。我可以connectloginpwdcwd。但是,当我尝试 list 文件时,它不会返回该目录中的文件列表,我确定那里有文件。我使用的是FTPFile[] listFiles()方法,它返回一个空数组FTPFile

请在下面的代码 sn-p 下找到我正在尝试的地方:

        String hostname = properties.getProperty("FTP_SERVER");
        String user = properties.getProperty("FTP_USER");
        String passwd = properties.getProperty("FTP_PASSWD");
        FTPClient client = new FTPClient();
        client.connect(hostname);
        client.login(user, passwd);
        String reply = client.getStatus();
        System.out.println(reply);
        client.enterRemotePassiveMode();
        client.changeWorkingDirectory("/uploads");
        FTPFile[] files = client.listFiles();
        System.out.println(files.length);
        for (FTPFile file : files) {
            System.out.println(file.getName());
        }

        String[] fileNames = client.listNames();
        if (fileNames != null) {
            for (String file : fileNames) {
                System.out.println(file);
            }
        }
        client.disconnect();

【问题讨论】:

标签: java apache-commons ftp-client


【解决方案1】:

这似乎与我遇到(并已解决)的问题相同,请参阅此答案:

Apache Commons Net FTPClient and listFiles()

【讨论】:

    【解决方案2】:

    在我将模式设置为PASV 后,它现在可以正常工作了! 感谢您的所有努力和建议!

    【讨论】:

      【解决方案3】:

      我添加了client.enterLocalPassiveMode(),它可以工作:

      client.connect("xxx.com");
      boolean login = client.login("xxx", "xxx");
      client.enterLocalPassiveMode();
      

      【讨论】:

        【解决方案4】:

        只是一个愚蠢的建议...您可以使用普通的 FTP 客户端在 /uploads 文件夹上列出列表吗?我问这个是因为某些 FTP 服务器被设置为不显示上传文件夹的列表。

        【讨论】:

          【解决方案5】:

          首先,确保该列表适用于其他程序。如果是这样,一种可能性是文件列表没有被正确解析。您可以尝试显式指定要与 initiateListParsing 一起使用的解析器。

          【讨论】:

          • 是的——例如,传递给 listFile 的 FTPFileListParser 实现可能会假设行必须有一定的长度,然后使用不同的 LIST 命令实现错过服务器上的所有文件。
          【解决方案6】:

          我遇到了同样的问题,结果证明它无法解析服务器为文件列表返回的内容。我这行连接ftp服务器后ftpClient.setParserFactory(new MyFTPFileEntryParserFactory());

          public class MyFTPFileEntryParserFactory implements FTPFileEntryParserFactory {
          private final static FTPFileEntryParser parser = new UnixFTPEntryParser() {
              @Override public FTPFile parseFTPEntry(String entry) {
                  FTPFile ftpFile = new FTPFile();
                  ftpFile.setTimestamp(getCalendar(entry));
                  ftpFile.setSize(get(entry));
                  ftpFile.setName(getName(entry));
                  return ftpFile;
              }
          };
          
          @Override public FTPFileEntryParser createFileEntryParser(FTPClientConfig config) throws ParserInitializationException {
              return parser;
          }
          
          @Override public FTPFileEntryParser createFileEntryParser(String key) throws ParserInitializationException {
              return parser;
          }
          

          }

          【讨论】:

          • 同样,我查看的代码每次都调用自定义解析器,而不是在系统类型为普通 Unix 时允许自动检测解析器。
          【解决方案7】:

          在我的例子中,除了应用 enterLocalPassiveMode 并指示正确的操作系统之外,我还需要将 UnparseableEntries 设置为 true 以使 listFile 方法工作。

          FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
          conf.setUnparseableEntries(true);
          f.configure(conf);
          boolean isLoginSuccess = client.login(username, password);
          

          【讨论】:

            猜你喜欢
            • 2023-03-30
            • 2018-04-04
            • 1970-01-01
            • 2013-02-19
            • 2011-06-08
            • 2011-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多