Problema com FTP

6 respostas
A

Galera … Boas tardes … !!!

Estou utilizando a biblioteca org.apache.commons.net.ftp.* para fazer um programinha que faça FTP do cliente para aqui na empresa.

Tudo funciona legalzinho: Conecta, Autentica, etc e tal … sem exceptions.

...
ftp = new FTPClient();
ftp.connect(host, 21);
reply = ftp.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
   Log.novo("Conexao recusada pelo servidor");
   ftp.disconnect();
}
...
if (!ftp.login(user, password)) {
   Log.novo("Usuario ou senha invalidos no servidor");
   disconnect();
}
...
if (!ftp.setFileType(FTP.BINARY_FILE_TYPE)) {
   Log.novo("Falha ao colocar FTP em tipo Binario.");
}

Mas quando eu executo o storeFile, não transfere.

if (!ftp.storeFile(fileId, input)) {
   Log.novo("Não conseguiu transferir o arquivo:"
}

Mas só acontece isso se a maquina conectada(Maquina do Cliente) estiver atrás de um Firewall. E mesmo desabilitando o Firewall não envia o arquivo.(Ambiente Linux nas duas pontas).
Mas o que mais de deixa pensativo … é que não gera exception, apenas vem FALSE do método storeFile.

Alguém ja passou por isso ???

Ou … Alguém utiliza outra biblioteca para fazer FTP ???

Valew Galera !! e Ótima Sexta pra todos.

6 Respostas

D

Sim. Passei por esse problema com o maldito storeFile(). O problema foi resolvido quando passei a usar o método storeFileStream().

Abaixo um exemplo do código que eu uso (se não me engano, esse code-snippet existe na propria documentação do commons net).

File f = new File("nomearquivo.aqui");

//  envia o arquivo
//
try {
   if (!ftp.changeWorkingDirectory("/nome/dir")) {
      log.error("FTP: FALHOU [cd] /nome/dir.");
      return false;
   }
                  
   ftp.setFileType(FTP.BINARY_FILE_TYPE);
                 
   InputStream  input  = new FileInputStream(f);
   OutputStream output = ftp.storeFileStream(f.getName());
                  
   int reply = ftp.getReplyCode();
                  
   if (!FTPReply.isPositivePreliminary(reply)) {
      if (input != null) input.close();
      if (output != null) output.close();
      log.error("FTP: Reply " + reply + ".");
      return false;
   }
                  
   Util.copyStream(input, output);
   input.close();
   output.close();
                  
   if (!ftp.completePendingCommand()) {
      log.error("FTP: (impossivel completar comando pendente).");
   }
                  
}
catch (Exception e) {
   log.error(e);
   return false;
}
A

dango

Utilizei o fonte que vc me passou … e esta gerando uma exception.

:arrow: FTP Reply Erro:500

Sabe me dizer qual é esse Erro:500 ?? ou onde posso encontrar ??

Obrigadúú. :smiley:

A

Olá pesso all :smiley:

dango
Eu fiz esse exemplo que vc colocou aqui e gerou a exception acima.
Pois bem … Eu verifiquei que esse erro 500 é “500 Illegal PORT command.”

Eu fiz uma analogia com o wsFtp e verifiquei que o wsFtp altera a porta de conexão. Segue o Log.

connecting to 200.136.26.397:21
Connected to 200.136.26.397 port 21
220 ready, dude (vsFTPd 1.1.0: beat me, break me)
USER usradm
331 Please specify the password.
PASS (hidden)
230 Login successful. Have fun.
PWD
257 "/home/sync"
SYST
215 UNIX Type: L8
Host type (S): UNIX (standard)
PASV
227 Entering Passive Mode (200,136,26,397,225,155)
connecting to 200.136.26.397:57755
- -
connecting to 200.136.26.397:57755

Connected to 200.136.26.397 port 57755

Observem que é alterada a porta de conexão de 21 para 57755, cujo numero é aleatorio.

Então eu gostaria de saber … Se dá pra fazer isso ?? se sim , Como ??

Muito obrigado pela ajuda !!! :smiley:

T

Nunca usei o Commons Net, mas ele tem algo para deixar o ftp em ‘passive mode’? Só uma sugestão.

A

Entaum thingol,

É justamente isso que eu gostaria de saber, como colocar em passive mode !! hehe…

Vc comentou que não usa o commons net, qual vc usa ?? pode mandar o link para download e se possível um exemplo ???

Muito obrigado :smiley:

A

Galera !! …

O problema foi solucionado assim:

no fonte eu coloquei

ftp.enterLocalActiveMode();
ftp.enterLocalPassiveMode();

Mas no servidor, não do cliente … e sim na outra ponta … a porta 21, que é para trafego de dados estava aberta, mas a porta 20, que é para trafego de comandos, estava bloqueada !! … Não ia funcionar nunca … hehehe …

Obrigado a todos pelo Help. :smiley:

Criado 25 de fevereiro de 2005
Ultima resposta 17 de mar. de 2005
Respostas 6
Participantes 3