Funções Completas - Comunicação entre aplicações Android e FTP

Tive dificuldades para programar funções de comunicação com FTP em uma aplicação Android, apesar de nunca
ter usado isto em uma aplicação real, apenas estudo mesmo. Como somos livres, garimpei o conhecimento de
vários sites (em várias línguas), e então, resolvi unificar e publicar aqui no Viva o Linux.

[ Hits: 13.477 ]

Por: Adriano Langaro em 14/03/2012


Programando



As funções não são complexas, mas precisam ser exatas. O que precisamos fazer é o seguinte:

- Importar os pacotes da Lib externa (explicada na página: Requerimentos):

import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; import org.apache.commons.net.ftp.FTPReply;


- Fazer mais alguns imports necessários:

import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.net.InetAddress; import android.util.Log; import android.view.View; import android.widget.Toast;


- Declarar duas variáveis necessárias:

private static final String TAG = null; public FTPClient mFTPClient = null;


- Vamos às funções, esta é a conexão. Esta função serve para conectar ao FTP:

public boolean ConectaFTP(String host, String username, String password, int port){ try { mFTPClient = new FTPClient(); //Conectando com o Host mFTPClient.connect(host, port); //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(); return status; } } catch(Exception e) { Log.d(TAG, "Error: Impossível conectar ao host " + host); } return false; }


- Esta para desconectar, obviamente:

public boolean DesconectarFTP(){ try { mFTPClient.logout(); mFTPClient.disconnect(); return true; } catch (Exception e) { Log.d(TAG, "Um erro ocorreu durante a desconexão do FTP"); } return false; }


- Esta função é realmente útil, ela serve para retornar o diretório de trabalho atual do FTP

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


- Mais uma função particularmente útil capaz de mudar o diretório de trabalho atual

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


- Esta outra imprime a lista dos arquivos e diretórios de um determinado caminho direto nos Logs do Eclipse

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(TAG, "Arquivo : " + name); } else { Log.i(TAG, "Diretório: " + name); } } } catch(Exception e) { e.printStackTrace(); } }


- Função semelhante a anterior, porém imprime a lista de arquivos em uma Toast:

public void imprimeListaArquivosToast(String caminho_dir) { try { FTPFile[] ftpFiles = mFTPClient.listFiles(caminho_dir); int length = ftpFiles.length; String list = ""; for (int i = 0; i < length; i++) { String name = ftpFiles[i].getName(); boolean isFile = ftpFiles[i].isFile(); if(isFile){ list += "Arquivo: "+name+" \n"; }else{ list += "Diretório: "+name+" \n"; } } Toast.makeText(this, list, Toast.LENGTH_SHORT).show(); } catch(Exception e) { e.printStackTrace(); } }


- Cria um diretório com o nome e a localização passadas por parâmetro:

public boolean criaDiretorioFTP(String novo_caminho_dir) { try { boolean status = mFTPClient.makeDirectory(novo_caminho_dir); return status; } catch(Exception e) { Log.d(TAG, "Erro: Impossível criar um diretório chamado " + novo_caminho_dir); } return false; }


- Deleção de um diretório:

public boolean removeDirFTP(String caminho_dir) { try { boolean status = mFTPClient.removeDirectory(caminho_dir); return status; } catch(Exception e) { Log.d(TAG, "Erro: Impossível excluir o diretório chamado " + caminho_dir); } return false; }


- Deleta um arquivo:

public boolean removeArquivoFTP(String caminho_arquivo) { try { boolean status = mFTPClient.deleteFile(caminho_arquivo); return status; } catch (Exception e) { e.printStackTrace(); } return false; }


- Renomear um arquivo. Lembre-se que devemos parametrizar o caminho completo do arquivo:

public boolean renomearArquivo(String de, String para) { try { boolean status = mFTPClient.rename(de, para); return status; } catch (Exception e) { Log.d(TAG, "Impossível renomear: " + de+ " para: " + para); } return false; }


- Vamos às funções mais importantes. Download de arquivos:

/** * caminho_arquivo_origem: Caminho completo do arquivo centro do FTP * destino_arquivo: Caminho completo do arquivo para o SDCard */ public boolean downloadFTP(String caminho_arquivo_origem, String destino_arquivo) { boolean status = false; try { FileOutputStream desFileStream = new FileOutputStream(destino_arquivo);; status = mFTPClient.retrieveFile(caminho_arquivo_origem, desFileStream); desFileStream.close(); return status; } catch (Exception e) { Log.d(TAG, "download failed - "+e); } return status; }


-Upload de Arquivos:

/** * caminho_arquivo_origem: Caminho completo do arquivo a ser upado no SDCard * nome_arquivo_destino: Caminho completo e nome com o qual o arquivo deve ser upado no FTP */ public void uploadFTP(String caminho_arquivo_origem, String nome_arquivo_destino){ try{ FileInputStream arqEnviar = new FileInputStream(caminho_arquivo_origem); if (mFTPClient.storeFile(nome_arquivo_destino,arqEnviar)) Toast.makeText(getBaseContext(), "Arquivo Enviado com Sucesso", Toast.LENGTH_LONG).show(); else Toast.makeText(getBaseContext(), "Erro ao Enviar", Toast.LENGTH_LONG).show(); }catch(Exception e){ Log.d(TAG, "Error - "+e); } }


Então, creio que era isso.

Agora é só chamar as funções e parametrizar corretamente. :D
Página anterior    

Páginas do artigo
   1. Requerimentos
   2. Programando
Outros artigos deste autor

Android e Eclipse no Ubuntu 11.10 - Problemas? Eis a solução

Leitura recomendada

Jmeter com qualidade e performance

Testes unitários em Java com JUnit

Busca corporativa com Apache Solr - Motivação e conceitos

Configurando e-Gen + Tomcat + JSDK

Java: Usando JInternalFrame de forma elegante

  
Comentários
[1] Comentário enviado por davimendes em 15/03/2012 - 00:48h

Legal!!!

[2] Comentário enviado por dimasdaros em 16/03/2012 - 09:13h

wow, excelente, brigadão mesmo ai =)

[3] Comentário enviado por adrianolangaro em 16/03/2012 - 10:58h

vlw vlw :D


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts