Domanda

Il metodo listFiles() di org.apache.commons.net.ftp.FTPClient funziona bene con il server Filezilla su 127.0.0.1 ma ritorna null nella directory principale del server FTP pubblici come belnet.be.

C'è una questione identica sul link qui sotto, ma enterRemotePassiveMode() non sembra aiuto. Apache Commons FTPClient.listFiles

Potrebbe essere un problema con la lista l'analisi? Se sì, come si può fare per risolvere questo?

Edit: Ecco una discarica cache di directory:

Dump FileZilla Directory cache

Dumping 1 directory nella cache

Entry 1:
Path: /
Server: anonymous@ftp.belnet.be:21, type: 4096
Directory contains 7 items:
  lrw-r--r-- ftp ftp      D          28      2009-06-17   debian
  lrw-r--r-- ftp ftp      D          31      2009-06-17   debian-cd
  -rw-r--r-- ftp ftp                  0 2010-03-04 13:30  keepalive.txt
  drwxr-xr-x ftp ftp      D        4096 2010-02-18 14:22  mirror
  lrw-r--r-- ftp ftp      D           6      2009-06-17   mirrors
  drwxr-xr-x ftp ftp      D        4096      2009-06-23   packages
  lrw-r--r-- ftp ftp      D           1      2009-06-17   pub

Ecco il mio codice utilizzando un wrapper che ho fatto (test all'interno della confezione produce gli stessi risultati):

public static void main(String[] args) {        
    FTPUtils ftpUtils = new FTPUtils();
    String ftpURL = "ftp.belnet.be";
    Connection connection = ftpUtils.getFTPClientManager().getConnection( ftpURL );

    if( connection == null ){
        System.out.println( "Could not connect" );
        return; 
    }

    FTPClientManager manager = connection.getFptClientManager();
    FTPClient client = manager.getClient();

    try {
        client.enterRemotePassiveMode();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    if( connection != null ){
        System.out.println( "Connected to FTP" );
        connection.login("Anonymous", "Anonymous");
        if( connection.isLoggedIn() ){
            System.out.println( "Login successful" );
            LoggedInManager loggedin = connection.getLoggedInManager(); 
            System.out.println( loggedin );
            String[] fileList = loggedin.getFileList();

            System.out.println( loggedin.getWorkingDirectory() );

            if( fileList == null || fileList.length == 0 )
                System.out.println( "No files found" );
            else{
                for (String name : fileList ) {
                    System.out.println( name );
                }
            }

            connection.disconnect();

            if( connection.isDisconnected() )
                System.out.println( "Disconnection successful" );
            else
                System.out.println( "Error disconnecting" );
        }else{
            System.out.println( "Unable to login" );
        }
    } else {
        System.out.println( "Could not connect" );
    }
}

produce questo risultato:

Connected to FTP
Login succesful
utils.ftp.FTPClientManager$Connection$LoggedInManager@156ee8e
null
No files found
Disconnection successful

All'interno della confezione (tentato utilizzando sia listNames() e listFiles()):

        public String[] getFileList() {
            String[] fileList = null;
            FTPFile[] ftpFiles = null;

            try {
                ftpFiles = client.listFiles();
                //fileList = client.listNames();
                //System.out.println( client.listNames() );
            } catch (IOException e) {
                return null;
            }

            fileList = new String[ ftpFiles.length ];

            for( int i = 0; i < ftpFiles.length; i++ ){
                fileList[ i ] = ftpFiles[ i ].getName();
            }

            return fileList;
        }

Per quanto riguarda FTPClient, viene gestita come segue:

public class FTPUtils {

private FTPClientManager clientManager;

public FTPClientManager getFTPClientManager(){
    clientManager = new FTPClientManager();
    clientManager.setClient( new FTPClient() );

    return clientManager;
}
È stato utile?

Soluzione

Ogni server FTP ha un layout diverso elenco di file (sì, non è parte dello standard FTP, è muto), e quindi bisogna usare il FTPFileEntryParser corretta, sia specificando manualmente, o permettendo CommonsFTP di rilevare automaticamente esso.

Rilevamento automatico di solito funziona bene, ma a volte non è così, ed è necessario specificarlo in modo esplicito, per es.

FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);

FTPClient client = FTPClient();
client.configure(conf);

Questa imposta in modo esplicito il tipo di server FTP dovrebbe UNIX. Provate i vari tipi, vedere come va. Ho cercato di scoprire me stesso, ma si rifiuta ftp.belnet.be mie connessioni: (

Altri suggerimenti

Hai provato a verificare che è possibile elencare i file utilizzando il normale client FTP? (Per qualche ragione, non riesco nemmeno a collegarsi alla porta FTP di "belnet.be".)

Modifica

Secondo il Javadoc per ListFiles () , l'analisi viene fatto usando il FTPFileEntryParser esempio fornito dalla fabbrica parser. Probabilmente avete bisogno di capire quale dei parser corrisponde uscita LIST del server FTP e configurare la fabbrica di conseguenza.

C'è stato un problema di analisi nella precedente versione di Apache Commons-net, il SYST di comando che restituisce il tipo di server in cui restituisce null (bruscamente) non era gestito in parsingException. Provare a utilizzare il ultima vaso di apache-commons-net si può risolvere il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top