41

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);
centic
  • 15,565
  • 9
  • 68
  • 125
Vladimir Mihailenco
  • 3,382
  • 2
  • 24
  • 38

4 Answers4

101

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
JasonMArcher
  • 14,195
  • 22
  • 56
  • 52
PapaFreud
  • 3,636
  • 4
  • 34
  • 45
  • 1
    (Regarding the BTW comment: `Assert.assertTrue` is from JUnit or TestNG; Java's assert would simply be `assert`. Anyway, I guess the point was just to illustrate desired outcome to readers of the question.) – Jonik Apr 15 '13 at 12:26
  • @Jonik Oh, that's right. I wasn't paying attention. I removed that bit. – PapaFreud Apr 19 '13 at 07:54
  • there are localpassive remotepassive, localactive, remoteactive i tried them one after another, and yeh localpassive worked – Junchen Liu Jul 11 '14 at 11:45
  • Thanks a ton my dear friend, i searched all the website but unable to find any solution to this issue. You code saved me! Just cool – Rajesh Kumar Yadav Jun 05 '19 at 18:49
14

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());
    }
suketup
  • 469
  • 7
  • 12
3

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

client.login("anonymous", "");
Paul Richter
  • 10,908
  • 10
  • 52
  • 85
Gelvis
  • 189
  • 1
  • 6
0

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());
                }
Sunny Gupta
  • 719
  • 8
  • 7