FTP e uma série de problemas com estruturação da classe

6 respostas
russo

Bom galera, dei uma olhada de leve na documentacao da commons net ftp
deu de fazer bastante coisa.
Criei uma classe funcoesFTP
e os metodos
conecta
recebe
envia
disconecta
getPasta

Até funciona com algumas limitações, sao elas:

1 - Não consegui dar um retorno ao usuario sobre o processo q está acontecendo se está enviando, quantos por % foi enviado/recebido, esse tipo de informacao, acredito q seja usando threads pesquisei muito na internet nao entendi o conceito e peguei alguns exemplos mas nao consegui implementar na minha classe.

2 - Quando recebo um arquivo o mesmo fica bloqueado, inacessivel, só depois que a aplicação é fechada eu consigo acessar.

Alguem poderia me ajudar com esses problemas?
segue abaixo minha classe:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package funcoesglobais;

import java.io.File;  
import java.io.InputStream;  
import java.io.FileInputStream;  
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.swing.JOptionPane;

import org.apache.commons.net.ftp.FTPReply;  
import org.apache.commons.net.ftp.FTPClient;  
  
public class funcoesFTP  extends java.lang.Thread {
    
 FTPClient ftp = new FTPClient();
 String tx="";

    public void Conecta(String txUrl,String txUsuario,String txSenha){
        tx="Conectando ao servidor...";
     try {  
         ftp.connect( txUrl );  
              
            //verifica se conectou com sucesso!  
            if( FTPReply.isPositiveCompletion( ftp.getReplyCode() ) ) {  
                ftp.login( txUsuario , txSenha ); 
                 tx="Conectado...";
            } else {  
                //erro ao se conectar  
                ftp.disconnect();
               tx="Conexão recusada!";
                System.exit(1);  
            }  
        } catch( Exception e ) { 
            tx= "Ocorreu um erro: "+e;   
        }
    }
    
    public void Disconecta(){
        try {  
            ftp.logout();
            ftp.disconnect();
        } catch( Exception e ) {
            JOptionPane.showMessageDialog(null,"Ocorreu um erro: "+e);

        }
    }
    
    public void getPasta(String txPasta){
    
    //informa a pasta
    tx="Entrando na pasta...";   
    try {
        
    boolean boo = ftp.changeWorkingDirectory(txPasta);
    } catch( Exception e ) { 
        tx="Ocorreu um erro: "+e;   
    }
    
    }
    
       
    public void envia(String txArquivo,String nomeArquivo){
        tx = "Enviando arquivo...";   
        try {  
        InputStream is = new FileInputStream( txArquivo );
       
            //ajusta o tipo do arquivo a ser enviado  
            if( txArquivo.endsWith(".txt") ) {  
                ftp.setFileType( FTPClient.ASCII_FILE_TYPE );  
            } else if( txArquivo.endsWith(".jpg") ) {  
                ftp.setFileType( FTPClient.BINARY_FILE_TYPE );  
            } else {  
                ftp.setFileType( FTPClient.ASCII_FILE_TYPE );  
            }  

            tx="Enviando arquivo "+nomeArquivo+"...)";

            ftp.storeFile( nomeArquivo, is );

            tx= "Arquivo "+nomeArquivo+" enviado com sucesso!";  
        
        } catch( Exception e ) { 
           tx = "Ocorreu um erro: "+e;   
        }
        }
    
   public void recebe(String ArquivoOrigem,String ArquivoDestino){
       tx = "Recebendo arquivo...";
     try {  
        ftp.setFileType( FTPClient.BINARY_FILE_TYPE );  
        OutputStream os = new FileOutputStream(ArquivoDestino);
        ftp.retrieveFile(ArquivoOrigem, os);
        tx = "Arquivo recebido com sucesso...";
      } catch( Exception e ) { 
          System.out.println("Ocorreu um erro: "+e);
        }
    }
   
    @Override
     public void run() {
      System.out.println(tx);
          
     }
    }
classe para testar
public class teste {
public static void main(String args[]) {
    funcoesFTP ftp = new funcoesFTP();
        String txOrigem ="teste.pdf";
        String txDestino = "c:\\Documentos\\teste.pdf";
        ftp.start();
        ftp.Conecta("ftp.endereco", "usuario", "senha1234");
        ftp.getPasta("pdf");
        ftp.recebe( txOrigem , txDestino );
        ftp.Disconecta();
}
}

Tenho dificuldades de modelar classe, estou procurando entender.

6 Respostas

panthovillas

utilizando Windows ?? ele faz isso msm!

otavio

Basicamente para você saber a porcentagem enviada e/ou recebida, você precisa antes de iniciar tudo saber o tamanho do stream, e conforme você for lendo/escrevendo, calcula-se o tamanho total - tamanho lido/enviado. Assim você sabe a porcentagem.

russo

panthovillas:
russo:

2 - Quando recebo um arquivo o mesmo fica bloqueado, inacessivel, só depois que a aplicação é fechada eu consigo acessar.

utilizando Windows ?? ele faz isso msm!

panthovillas valeu pela atencao, se no windows nao tem jeito entao nao tem jeito.

Como faco pra resolver o primeiro problema?

russo

russo:
panthovillas:
russo:

2 - Quando recebo um arquivo o mesmo fica bloqueado, inacessivel, só depois que a aplicação é fechada eu consigo acessar.

utilizando Windows ?? ele faz isso msm!

panthovillas valeu pela atencao, se no windows nao tem jeito entao nao tem jeito.

Como faco pra resolver o primeiro problema?

Bom conseguir resolver esse problema, não é por causa do windows, e sim pq é necessário fechar o objeto stream:

na hora de receber:

OutputStream os = new FileOutputStream(ArquivoDestino); ftp.retrieveFile(ArquivoOrigem, os); os.close

e na hora de enviar:

InputStream is = new FileInputStream( txArquivo ); ftp.storeFile( nomeArquivo, is ); is.close

Mas ainda tenho o problema numero 1: da thread, o retorno para o usuario, alguem pode me ajudar?

willianmuniz

A parte de porcentagem de download nao consegui fazer nao,

unica coisa que consegui foi a seguinte…

esse método de enviar arquivo ele retorna um boolean, coloquei num if

if(ftp.retrieveFile(ArquivoOrigem, os){ TextArea.setText("Arquivo Baixado com Sucesso!"); }else{ TextArea.setText("Falha ao baixar arquivo!"); }

E

Para acompanhar o progresso, leia esta documentação:
http://commons.apache.org/net/apidocs/org/apache/commons/net/ftp/FTPClient.html#setCopyStreamListener(org.apache.commons.net.io.CopyStreamListener)
http://commons.apache.org/net/apidocs/org/apache/commons/net/io/CopyStreamListener.html
http://commons.apache.org/net/apidocs/org/apache/commons/net/io/CopyStreamEvent.html

Criado 3 de junho de 2009
Ultima resposta 18 de out. de 2011
Respostas 6
Participantes 5