Vladimir Mihailenco
Vladimir Mihailenco

Reputation: 3382

Apache Commons Net FTPClient and listFiles()

Can anyone explain me what's wrong with the following code? I tried different hosts, FTPClientConfigs, it's properly accessible via firefox/filezilla... The problem is I always get empty filelist without any exceptions (files.length == 0). I use commons-net-2.1.jar installed with Maven.

    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);

Upvotes: 41

Views: 45768

Answers (4)

Sunny Gupta
Sunny Gupta

Reputation: 847

For me it worked when I used ftpClient.enterLocalPassiveMode() just before calling ftpClient.listFiles(). Here is the full code:

                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());
                }

Upvotes: 0

suketup
suketup

Reputation: 469

Only using enterLocalPassiveMode() did not work for me.

I used following code, which worked.

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

Complete example is as below,

    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());
    }

Upvotes: 14

PapaFreud
PapaFreud

Reputation: 3888

Found it!

The thing is you want to enter passive mode after you connect, but before you log in. Your code returns nothing for me, but this works for me:

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());
        }
    }
}

Gives me this output:

c128
c64
c64.hu
incoming
plus4

Upvotes: 101

Gelvis
Gelvis

Reputation: 189

usually the annonymous user doesn't need a password, try

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

Upvotes: 3

Related Questions