Mostrando postagens com marcador Commons Net. Mostrar todas as postagens
Mostrando postagens com marcador Commons Net. Mostrar todas as postagens

quinta-feira, 9 de outubro de 2014

Java + FTP - É possível ?

Construir um projeto Java que precise utilizar de um servidor FTP, é possível ? Terei de usar ferramentas externas para ter acesso aos arquivos ? O que é FTP ?

Todas essas perguntas serão respondidas hoje. Vamos começar pelo começo. FTP é a sigla para File Transfer Protocol o qual, é um protocolo da camada de Aplicação do modelo OSI. Como o próprio nome já diz, esse protocolo é usado para transferência de arquivos. Não entrarei a fundo na explicação do FTP. O que você precisa saber para este tópico está escrito neste parágrafo.

Construir um projeto Java que precise utilizar de um servidor FTP, é possível ? Sim, é possível e não somente, é possível como, é fácil também.

Terei de usar ferramentas externas para ter acesso aos arquivos ? Não. Salvo somente os casos em que seja obrigatório usar alguma ferramenta externa ou, seja de vontade do próprio desenvolvedor.

Agora que já sabemos que é possível trabalhar com Java + FTP, vamos ao exemplo.

Primeira etapa - Montar o ambiente

Montar um ambiente Java + FTP é fácil. Precisamos de:

  • Eclipse Luna (4.4.0)
  • Maven (se quiser)
  • Jar Commons Net 3.3 (caso não use Maven)
Caso você não queira usar o Maven, sem problemas. Baixe o JAR do Commons Net, clicando aqui. No nosso exemplo usaremos o Maven. Crie um Maven Project com o archtype quickstart. Caso você possua alguma dúvida com a criação do projeto, nosso amigo Mkyong realizou uma ótima contribuição, através do link.Com o projeto criado, insira a seguinte dependência:

<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>

Depois de ter inserido a dependência, já podemos começar a programar.

Segunda etapa - Programação

Para habilitar o FTP na sua máquina é necessário realizar algumas configurações no Windows, clique aqui para mais informações. Com seu servidor FTP habilitado e criado, vamos para o Java.

Crie uma classe com o nome de App. Depois de ter criado a classe, vamos criar duas constantes (LOGIN e PASSWORD).

private static final String LOGIN = "meu_usuario";
private static final String PASSWORD = "minha_senha";

Crie um método main e crie um método chamado gerarConexao(). Este método será responsável por gerar a conexão FTP e retornar o objeto que representa o mesmo.

private FTPClient gerarConexao() throws SocketException, IOException{
    FTPClient ftpClient = new FTPClient();
    ftpClient.connect("127.0.0.1"); //Conecta ao Servidor FTP
    ftpClient.login(LOGIN, PASSWORD); //efetua o login no Servidor
    //ftpClient.changeWorkingDirectory("minha_pasta"); //Muda o diretório de trabalho do servidor
    return ftpClient;
}

O código acima é bem tranquilo. Creio que não necessito fazer mais explicações.

Com o nosso método de realizar conexões feito, podemos trabalhar diretamente com os arquivos. Vamos agora, listar todos os arquivos do servidor. Construa o método lerArquivos(FTPClient ftpClient). Este método recebe uma instância de FTPClient o qual, representa nossa conexão.

private void lerArquivos(FTPClient ftpClient) throws IOException{
    FTPFile[] arqs = ftpClient.listFiles(); //lista os arquivos
        System.out.println ("Listando arquivos: \n");
        for (FTPFile f : arqs){
        System.out.println(f.getName() + " - " + f.getType()); //imprimo o nome do arquivo e seu tipo
        }
}

O método acima também é bem tranquilo. Abaixo, listo alguns métodos de listagem de arquivos.
  • listFiles() - Retorna uma lista de Objetos do tipo FTPFile. Para mais informações sobre a classe, clique aqui.
  • listNames(String caminho) – Mesmo que o anterior, mas passando como parâmetro o caminho do diretório a ser listado.
  • listNames() - Retorna um array de Strings contendo o nome dos arquivos no diretório de trabalho atual.
Agora vamos escrever um método para por arquivos no nosso servidor FTP. Escreva o método escreverArquivo(FTPClient ftpClient). Este método recebe uma instância de FTPClient o 
qual, representa nossa conexão.

private void escreverArquivo(FTPClient ftpClient) throws IOException{    
    FileInputStream novoArq = new FileInputStream("C:\\minha_pasta\\arquivo_origem.txt");
    if(ftpClient.storeFile("nome_novo_arquivo.txt", novoArq)){
    System.out.println("Arquivo armazenado com sucesso!");
    } else {
    System.out.println("Erro ao armazenar o arquivo.");
    }
}

O método acima cria um novo arquivo no FTP com o nome especificado no primeiro parâmetro do método storeFile. Este método retorna um boolean que, informa se a criação foi feita com sucesso ou não. O parâmetro novoArq representa o arquivo de origem da gravação.

Nosso último método, terá a tarefa de realizar o download de um arquivo que está no FTP. Construa o método recuperarArquivo(FTPClient ftpClient). Este método recebe uma instância de FTPClient o qual, representa nossa conexão.

private void recuperarArquivo(FTPClient ftpClient) throws IOException{
    FileOutputStream fos = new FileOutputStream("C:\\minha_pasta\\arquivo_download.txt");
    if (ftpClient.retrieveFile("arquivo_fonte.txt", fos ))
    System.out.println("Download efetuado com sucesso!");
    else
            System.out.println ("Erro ao efetuar download do arquivo.");
}

Acima, é possível notar que o método retrieveFile recebe dois parâmetros. O primeiro parâmetro representa o nome do arquivo que será feito o download e o segundo representa o destino do arquivo. Este método retorna um boolean que, indica se houve êxito ou não.

Precisamos de um método agora para realizar desconexão do nosso programa com o servidor FTP. Escreva o método logout(FTPClient ftpClient). Este método recebe uma instância de FTPClient o qual, representa nossa conexão.

private void logout(FTPClient ftpClient) throws IOException{
    ftpClient.logout();
    ftpClient.disconnect();
}

Este método dispensa explicações. Por último, temos o método main que chama todos os outros métodos.

public static void main( String[] args ) throws SocketException, IOException 
    {
    App app = new App();
    FTPClient ftpClient = app.gerarConexao();
    app.lerArquivos(ftpClient);
    app.escreverArquivo(ftpClient);
    app.recuperarArquivo(ftpClient);
    app.logout(ftpClient);
    }

Caso você queira baixar o projeto, clique aqui.

É possível notar, que trabalhar com Java e FTP é simples. Procurei por uma abordagem 100% Java mas, não achei. Quem souber, deixe nos comentários sua contribuição. A API Commons Net faz todo o trabalho pesado e para o desenvolvedor só fica a tarefa de processar os arquivos.

Referências:
http://www.devmedia.com.br/desenvolvendo-um-cliente-ftp/3547
Leia Mais ››