Olá, depois da série de introdução ao desenvolvimento Android iremos demonstrar como se conectar e enviar arquivos através de uma conexão FTP, todo o código necessário para a conexão, mudança de diretório e upload de arquivos será mostrada neste artigo. Para quem acompanhou a série de introdução e já está familiarizado com a programação em Java, será bem simples realizar a conexão com FTP e também enviar o arquivo para o servidor. Vamos lá!

Caso queira acompanhar a série de introdução ao desenvolvimento em Android:

desenvolvimento android

O QUE É FTP?

FTP significa File Transfer Protocol é uma das formas mais rápidas, versáteis e seguras de enviar e receber arquivos através da internet, é muito usado por quem possui um website e precisa enviar ou realizar download dos arquivos do servidor.

QUAL A NECESSIDADE DE USAR FTP?

Pequenas e grandes empresas estão utilizando aplicações móveis para auxiliar em alguns processos da empresa, estes aplicativos precisam se comunicar com os softwares de gestão da empresa de alguma forma, seja através de Web Services, conexão direta a um aplicativo web ou mesmo através de transferência de arquivos, nesta última a transferência via FTP é a melhor escolha.

Seria ideal se conectar diretamente com algum aplicativo web que tivesse acesso a base de dados principal e não houvesse a necessidade de transferência de arquivos, mas em alguns casos isso é necessário. Pense em um aplicativo móvel que seja usado para processar vendas, o funcionário se desloca até os clientes oferecendo o produto, faz a venda mas no momento de enviar a venda para a base principal, a internet não está funcionando, ou mesmo aquela região não possui sinal, o que fazer? É possível salvar tudo no próprio dispositivo, através de SQLLite, como já vimos nos artigos introdutórios e depois quando houver sinal de internet, transferir arquivos com o conteúdo do pedido. Em casos como este é muito necessário ter a funcionalidade de transferir arquivos via FTP.

Vamos a código!

CONETANDO AO SERVIDOR FTP

public boolean conectaFTP(String host, String username, String password){
        try {
            mFTPClient = new FTPClient();

            //Conectando com o Host
            mFTPClient.connect(host, 21);

            //Checa o código de resposta, se for positivo, a conexão foi feita
            if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {

                //Logando com username e senha
                boolean status = mFTPClient.login(username, password);

	            //Setando para o modo de transferência de Arquivos
	            mFTPClient.setFileType(FTP.BINARY_FILE_TYPE);
	            mFTPClient.enterLocalPassiveMode();
	            Log.i("STATUS", "CONECTADO");
	            return status;
            }
        } catch(Exception e) {
        	Log.i("STATUS", "NÃO CONECTADO");
        }

        return false;
}

Esta função tem o objetivo único de conectar ao servidor FTP, não realiza nenhuma função extra. A classe que é responsável por implementar a conexão é a FTPClient. A primeira codificação a ser feita é a criar uma instância de FTPClient, criamos esta instância com o nome de mFTPClient, que é uma variável do tipo FTPClient, que deve ser declarada no início da classe.

Na linha 6, é realizada a conexão, com o HOST, o endereço do servidor é determinado pela variável host, fizemos desta forma para que a função fique mais genérica possível e possa ser utilizada em muitos casos. Na linha 9 existe uma condição que verifica se a aplicativo conseguiu realizar a conexão inicial com o servidor, isto é verificado através da função: FTPReply.isPositiveCompletion(mFTPClient.getReplyCode()). Caso a função retorne verdadeiro a conexão foi iniciada com sucesso, caso o retorno seja negativo, o dispositivo por algum motivo, seja pela falta de internet, seja pelo endereço do servidor estar errado não conseguiu se conectar ao servidor.

Para que o aplicativo consega enviar e receber arquivos, listar arquivos e diretórios não é necessário apenas realizar a conexão com o servidor FTP, é necessário também efetuar login, pois só usuários com credenciais válidas possuem esta permissão. Na linha 12 a função login() é chamada, é necessário passar dois parâmetros, o login e a senha do usuário FTP. Caso a função retorne verdadeiro as credenciais são válidas, caso retorne falso, este usuário não existe ou a senha não confere.

A função conectaFTP sempre irá retornar verdadeiro, quando conseguir se conectar ao servidor e os parâmetros de login e senha forem certos, caso isso não aconteça ela retornará falso. Atente também para o uso do try-catch, usando essa estrutura conseguimos tratar algum erro que possa acontecer na tentativa de conexão com o servidor, enviando uma mensagem para o LOG do Eclipse.

FUNÇÕES PARA TRATAMENTO DE DIRETÓRIO

public String retornaDiretorioFTP()
  {
      try {
          String workingDir = mFTPClient.printWorkingDirectory();
          return workingDir;
      } catch(Exception e) {
          Log.i("ERRO", "Erro: Impossível obter o diretório de trabalho");
      }

      return null;
}

A função retornaDiretorioFTP(), como o nome mesmo sugere, retorna o diretório atual de trabalho no servidor FTP, essa função pode ser muito importante para saber se o diretório que se está trabalhando para realizar o upload de um certo arquivo é de fato o diretório correto. A linha mais importante desta função é a linha 4 onde é chamada a função printWorkingDirectory() que retorna uma String com o nome do diretório atual, lembrando sempre de usar o try-catch, pois como trabalhamos em um dispositivo android, muitas coisas podem ocorrer durante a chamada da função, conexão de internet pode falhar ou mesmo uma ligação pode interroper o processo.

public boolean mudarDiretorioFTP(String caminho_dir)
  {
      try {
          mFTPClient.changeWorkingDirectory(caminho_dir);
      } catch(Exception e) {
          Log.i("ERRO", "Erro: Impossível mudar o diretório para " + caminho_dir);
      }
      return false;
}

A função mudarDiretorioFTP() é uma das funções mais importantes no processo de envio e recebimento de arquivos, afinal você quase nunca irá enviar e receber arquivos diretamente da raiz do seu servidor FTP, quase sempre é necessário navegar até um diretório específico, a linha que faz mudança de diretório de fato é linha 4, nela é passado um parâmetro String que será usado para navegar. Como a chance de dar erro nesta operação é de certa forma grande também é de extrema importância envolver o código em uma estrutura try-catch, isso deve ser uma prática no desenvolvimento de aplicações para Android para minimizar as chances da aplicação parar e deixar o usuário a ver navios.

LISTANDO ARQUIVOS

public void imprimeListaArquivosLog(String caminho_dir)
{
     try {
             FTPFile[] ftpFiles = mFTPClient.listFiles(caminho_dir);
             int length = ftpFiles.length;

             for (int i = 0; i < length; i++) {
                 String name = ftpFiles[i].getName();
                 boolean isFile = ftpFiles[i].isFile();

                 if (isFile) {
                     Log.i("ARQUIVO", "Arquivo : " + name);
                 }
                 else {
                     Log.i("DIRETORIO", "Diretório: " + name);
                 }
             }
      } catch(Exception e) {
             e.printStackTrace();
      }
}

Em muitas ocasiões será necessário listar os arquivos e diretórios do FTP, criamos uma função que faz isso e imprime em forma de LOG, nada o impede de dar uma resposta para o usuário, a função cumpre seu papel que é retornar a listagem de arquivos e diretórios. Na linha 4 é criada um array do tipo FTPFile para guardar o retorno da função mFTPClient.listFiles() que retornará todos os arquivos e diretórios de um diretório passado por parâmentro. Mais abaixo é utilizado uma estrutura de repetição do tipo FOR para realizar a iteração pelo array e realizar a listagem dos arquivos e diretórios.

Nas linhas 8 e 9, podemos ver duas funções importantíssimas, a primeira retorna o nome do diretório ou artigo e a segunda é usada para verificar se o objeto listado é um diretório ou um arquivo, mais abaixo esta resposta é usada para a impressão do objeto com seu respectivo tipo.

ENVIO DE ARQUIVO VIA FTP

public boolean uploadFTP(String diretorioFTP, String diretorioAndroid, String arquivoFTP){
	try {
	          File file = new File(diretorioAndroid);
	          File file2 = new File(diretorioAndroid + arquivoFTP);
	          //verifica se é um diretório
	          if (file.isDirectory()) {
	              //verifica se há algum arquivo no diretório
	              if(file.list().length > 0){
	                  mFTPClient.enterLocalPassiveMode();
	                  mFTPClient.setFileTransferMode(FTPClient.ASCII_FILE_TYPE);
	                  mFTPClient.setFileType(FTPClient.ASCII_FILE_TYPE);
	                  mFTPClient.changeWorkingDirectory(diretorioFTP);
	                  FileInputStream arqEnviar = new FileInputStream( diretorioAndroid + arquivoFTP);  

	                  // Envio do arquivo
	                  if (mFTPClient.storeFile(arquivoFTP, arqEnviar)) {   

	                	  //deleta arquivo do dispositivo
	                	  file2.delete();
	                          arqEnviar.close();
	                          return true;
	                  } else {
	                	  arqEnviar.close();
	                      return false;
	                  }
	              }
	              else
	                  return false;
	          }
	          else
	              return false;  

	      } catch (Exception e) {
	    	  return false;
	}
}

O envio de um arquivo via FTP acarreta em algumas atividades, é necessário verificar se o arquivo realmente existe no dispositivo, verificar se a pasta para onde se quer enviar o arquivo existe realmente no servidor FTP e outras atividades, a função acima, faz de forma simples o envio de um arquivo existente no dispositivo. A função uploadFTP() requer três parâmetros, a pasta que se encontra o arquivo que será transferido, a pasta destino e o nome do arquivo a ser transferido.

Primeiramente é feito na linha 6, uma verificação se realmente existe aquele diretório. Após, na linha 8 é verificado se  há arquivos naquele diretório, Após é feita todas as transações necessárias no servidor FTP, como a mudança de diretório e outras funções. Na linha 13 é feito o carregamento do arquivo físico para a memória do dispositivo e finalmente na linha 16 é feita a transferência do arquivo de fato. Perceba que na função há uma série de verificações, em cada uma delas é retornado falso, para que quem utilize a função saiba que algo deu errado com a transferência do arquivo.  O único caso que ele retorna verdadeiro é se todas as condicionantes forem satisfeitas e o arquivo for, de fato, transferido, também é utilizado a estrtura try-catch pelos mesmos motivos citados acima.

CONCLUSÃO

Trabalhar com FTP no Android não é uma tarefa tão complicada, usando-se as funções e classes corretas é possível realizar muitas atividades e fazer com que seu aplicativo tenha uma interação bem interessante com um servidor de FTP. Aprender a realizar essa conexão é muito importante visto que muitos aplicativos de diversas categorias podem necessitar realizar esta conexão. Seguindo o padrão da API do Android as classes de conexão com FTP cumprem bem seu papel, restando ao desenvolvedor apenas utilizar-se delas para atingir o objetivo necessário.

Abraços.

 

Autor: Jair Rebello

Blog do Autor | Artigos do Autor:

Analista de Sistemas, empreendedor e blogueiro que dedica parte de seu tempo para a partilha de material de grande qualidade relacionados a Wordpress, SEO, Tableless, JQuery, PHP, Android e outras tecnologias mais. Pode me encontrar no Escola Sites ou O Android.

  • Explorer - Factory Construction & Ship Building Joomla Theme
  • Justice - Attorney and Law Firm Joomla Template
  • OwnFolio - One Page Personal Portfolio / vCard / Resume / Showcase Joomla Template
  • Big Business - Responsive Template
  • Merab - Creative Multipurpose Drupal 8 Theme
  • Fitness Academy Joomla Template
  • Fruition - Business Joomla Template
  • Educate | Education & Courses, Kindergartens Joomla Template
  • Constructive - Contractors Multipurpose Joomla Landing Page Theme
  • Vina Bubox - VirtueMart Joomla Template for Online Stores
  • BizOne - One Page Parallax Drupal Theme
  • LawHouse - Responsive Lawyers Attorneys Joomla Template

Gostou deste artigo? Então torne-se fã do Blog no Facebook!



Comentários dos Alunos


  1. Marcelo Petrucio
    13 de dezembro de 2012

    Olá vc Teria por um acaso algum projeto de exemplo para me enviar, pois minha palicaçao esta dando erro já procurei em varios lugares e nao achei nada…

    Att. Marcelo Petrucio



    • Jair Rebello
      26 de dezembro de 2012

      Marcelo, qual o problema que ocorre?



  2. Wilson Leonardo
    20 de fevereiro de 2013

    Bom dia Jair, sou novo em programação Android, estou precisando entregar um trabalho para conclusão de Curso, vc teria algum app para envio e recebimento de arquivos por ftp completo que posso me passar? Se tiver o codigo fonte melhor ainda, Obrigado.

    Att. Wilson Leonardo



  3. edimilso
    17 de março de 2013

    boa tarde, Marcelo
    muito bom seu artigo.

    mais eu estou com problema aqui no hora de rodar
    quando chega na função
    //Conectando com o Host
    mFTPClient.connect(host, 21);

    Trava a aplicação no meu celular.

    acredito que seja o apache.commons.net.jar
    ja fiz diversos downloads desse arquivo mesmo asssim não rodou.
    voce poderia me ajudar.

    u smathphone.



  4. Carlos Rafael
    22 de agosto de 2013

    Parceiro, bom dia !

    Teria como me disponibilizar esse arquivo pronto ?



  5. Developer
    30 de novembro de 2013

    A pessoa da uma baita ajuda e os caras so querem explorar a boa vontade do colega pedindo os codigos prontos… Da pra acreditar?



  6. Henrique
    27 de agosto de 2014

    Este método pode ser utilizado para criar um App do tipo de “Troca de Figurinhas” onde o usuário cadastra seus dados e posta uma foto da figurinha e vê quais figurinhas estão disponíveis para ele? Gostaria de fazer um app de troca de figurinhas tipo olx, este é o caminho? Como devo proceder?


RSS
Twitter
Facebook
Comentários
ASSINANTES
SEGUIDORES
FÃS
COMENTÁRIOS
7794

Subscrever Newsletter
Subscreva a Newsletter:



Aplicativos Android, iPhone e Muito Mais!




Assine a Escola Criatividade Assine a Newsletter da Escola Criatividade Escola Criatividade no Twitter Escola Criatividade no Facebook Escola Criatividade no Youtube Escola Criatividade no Google Buzz