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