Apache Commons Net FTPClient 和 listFiles()

Posted

技术标签:

【中文标题】Apache Commons Net FTPClient 和 listFiles()【英文标题】:Apache Commons Net FTPClient and listFiles() 【发布时间】:2011-02-12 08:49:00 【问题描述】:

谁能解释一下下面的代码有什么问题?我尝试了不同的主机,FTPClientConfigs,它可以通过 firefox/filezilla 正确访问......问题是我总是得到空文件列表,没有任何异常(files.length == 0)。我使用与 Maven 一起安装的 commons-net-2.1.jar。

    FTPClientConfig config = new FTPClientConfig(FTPClientConfig.SYST_L8);

    FTPClient client = new FTPClient();
    client.configure(config);

    client.connect("c64.rulez.org");
    client.login("anonymous", "anonymous");
    client.enterRemotePassiveMode();

    FTPFile[] files = client.listFiles();
    Assert.assertTrue(files.length > 0);

【问题讨论】:

任何错误信息?不知道你的问题是什么! 问题是我总是得到空文件列表,没有任何异常(files.length == 0)。问题已更新。 它在我的 FTP 服务器上运行良好,除了我不调用 client.configure(...) 我还尝试了 ftp.belnet.be / ftp.ccc.uba.ar 和一些私有 ftp 服务器,但无法使其工作(即使没有 client.configure)...我也尝试过禁用 windows 防火墙和杀毒软件...你能分享一些工作的 ftp 主机吗? ftp4j 基本示例工作正常,但我想知道我的 commons-net 代码有什么问题... 【参考方案1】:

通常匿名用户不需要密码,试试

client.login("anonymous", "");

【讨论】:

【参考方案2】:

找到了!

问题是您希望在连接后但在登录之前进入被动模式。 您的代码对我没有任何回报,但这对我有用:

import org.apache.commons.net.ftp.FTPClient;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPFile;

public class BasicFTP 

    public static void main(String[] args) throws IOException 
        FTPClient client = new FTPClient();
        client.connect("c64.rulez.org");
        client.enterLocalPassiveMode();
        client.login("anonymous", "");
        FTPFile[] files = client.listFiles("/pub");
        for (FTPFile file : files) 
            System.out.println(file.getName());
        
    

给我这个输出:

c128 c64 c64.hu 传入 加4

【讨论】:

(关于 BTW 评论:Assert.assertTrue 来自 JUnit 或 TestNG;Java 的断言将只是 assert。无论如何,我想这只是为了向问题的读者说明期望的结果。 ) @Jonik 哦,没错。我没注意。我删除了那个位。 有localpassive remotepassive、localactive、remoteactive我一个接一个地试了,还是localpassive有效 非常感谢我亲爱的朋友,我搜索了所有网站,但找不到任何解决此问题的方法。你的代码救了我!很酷 非常感谢!你刚刚拯救了我的星期五晚上!【参考方案3】:

只使用enterLocalPassiveMode() 对我不起作用。

我使用了以下代码,效果很好。

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

完整的例子如下,

    FTPSClient ftpsClient = new FTPSClient();        

    ftpsClient.connect("Host", 21);

    ftpsClient.login("user", "pass");

    ftpsClient.enterLocalPassiveMode();

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

    FTPFile[] files = ftpsClient.listFiles();

    for (FTPFile file : files) 
        System.out.println(file.getName());
    

【讨论】:

找不到方法:ftpClient.execPBSZ(0); ftpClient.execPROT("P") 您使用的是 FTPClient 还是 FTPSClient?这些方法只存在于 FTPSClient 中。【参考方案4】:

对我来说,当我在调用 ftpClient.listFiles() 之前使用 ftpClient.enterLocalPassiveMode() 时,它起作用了。 完整代码如下:

                final List<String> files = new ArrayList<>();
                try 
                    ftpClient.enterLocalPassiveMode();
                    String[] f = null;
                    if (parentDir.isEmpty()) 
                        f = ftpClient.listNames();
                    else
                        f = ftpClient.listNames(parentDir);
                    
                    for (String s :f ) 
                        files.add(s);
                    
                 catch (IOException e) 
                    e.printStackTrace();
                    postError(e.getMessage()!= null?e.getMessage():e.toString());
                

【讨论】:

以上是关于Apache Commons Net FTPClient 和 listFiles()的主要内容,如果未能解决你的问题,请参考以下文章

JAVA-使用Commons Net连接FTP

maven中,POM.XML中怎么配置org.apache.commons.net.ftp引用包,求配置代码- -

[Java] 使用 Apache的 Commons-net库 实现FTP操作

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S

org.apache.commons.net.MalformedServerReplyException: Could not parse response code. Server Reply: S