[PROBLEMAS] Listando arquivos do FTP (commons-net)

Bom Dia…
Estou tendo problema para listar os arquivos de um diretório no FTP.
Estou utilizando a API da apache commons-net.1.4.1

Parece que conecta normal, mas não retorna nenhum arquivo. O diretório existe e tem arquivos e outros diretórios dentro dele.
Se alguem puder me ajudar… :slight_smile:

Código

import java.io.IOException;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.commons.net.ftp.FTPFile;
public class Conecta {

	public static void main(String[] args) throws SocketException, IOException {
      FTPClient ftp = new FTPClient();
      ftp.connect( "ftp.aaaa.com.br" );
      ftp.login( "aaa", "aaa" );
      
      System.out.print("....: "+ftp.getReplyString());
      if(FTPReply.isPositiveCompletion( ftp.getReplyCode() )){
    	  System.out.println("....: Conectou");
      }
      ftp.changeWorkingDirectory ("public_html/docs");
      System.out.print("....: "+ftp.getReplyString());      
      
      System.out.println("....: Porta "+ftp.getDefaultPort());
      try{
	      FTPFile[] files = ftp.listFiles();
	      System.out.println("....: Testando com FTPFile");
	      System.out.println("....: Quantidade["+files.length+"]");
	      String[] arq = ftp.listNames();
	      System.out.println("....: Testando com ftp.listNames()");
	      System.out.println("....: Quantidade["+arq.length+"]");
	      
	      System.out.println ("Listando arquivos: \n");
	      for (String f : arq){
	            System.out.println(f);            
	      }
	     }catch (NullPointerException e) {
	    	  System.out.println(e.getMessage());
		}
	}
	
}

Retorno

....: 230-User usuario has group access to:  usuario 
230 OK. Current restricted directory is /
....: Conectou
....: 250 OK. Current directory is /public_html/docs
....: Porta 21
....: Testando com FTPFile
....: Quantidade[0]
....: Testando com ftp.listNames()
null

Coloquei um getReplayString depois que pede para listar o conteudo.
e me retornou.
500 I won’t open a connection to 192.168.0.3 (only to 189.58.999.99)

Pelo que entendi ta passando meu ip da rede interna, mais ele só aceita o ip do servidor.

FTP é um cabra safado da peste.
O protocolo FTP exige que você, como client, seja capaz de abrir um socket em modo server (coisa esquisita, não?), e é por isso que você provavelmente está tendo essa mensagem estranha.
Se você puder usar o servidor FTP em modo passivo, então faça isso, para evitar tais problemas.
http://commons.apache.org/net/apidocs/index.html - enterLocalPassiveMode

Valeu thingol, funcionou certinho…
foi só incluir o metodo FTPClient.enterLocalPassiveMode();
Tai o código funcionando

[code]import java.io.IOException;
import java.net.SocketException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

public class Conecta {

public static void main(String[] args) throws SocketException, IOException {

  FTPClient ftp = new FTPClient();
  ftp.connect( "ftp.aaa.com.br" );
  ftp.login( "aaa", "aaa" );

  if(FTPReply.isPositiveCompletion( ftp.getReplyCode() )){
	  System.out.println("....: Conectado");
	  ftp.enterLocalPassiveMode();
  }
  ftp.changeWorkingDirectory ("public_html/docs");
  
  System.out.print("....: "+ftp.getReplyString());    
  System.out.println("....: Porta "+ftp.getDefaultPort());
  
  try{
      String[] arq = ftp.listNames();
      System.out.println ("Listando arquivos: \n");
      for (String f : arq){
            System.out.println(f);            

}

    ftp.logout();
    ftp.disconnect();	      
      
      
     }catch (NullPointerException e) {
    	  System.out.println(e.getMessage());
	}catch (SocketException es){
		System.out.println(es.getMessage());
	}
}

}[/code]

1 curtida