Integrar FTP com Java

10 respostas
A

Ola srs.,

Bom, estava procurando dicas para integrar Java com FTP. Basicamente, eu estou precisando do seguinte:

  1. Login integrado com o meu sistema, ou seja, vai buscar o usuário e senha de acordo com o meu sistema.
  2. Vai retornar os diretórios de acordo com os que eu definir no Java, baseado nessa role de autenticação. Com permissoes de leitura e escrita a partir disso.

Alguém sabe onde encontro esse material?

[]'s!

10 Respostas

A

Nunca trabalhei com FTP em Java, mas ouço falar muito de uma API chamada Commons-Net. Pesquise sobre ela, talvez ela possa suprir suas necessidades.

A

Opa,

O problema é que eu precisava disso na forma de server FTP… Ou seja, o usuário iria bater no ftp://sistema.com.br e aí, dando seu usuário e senha, iria logar. Retornando assim os diretórios de acordo com o sistema… Eu não sei se seria caso criar um interceptor, ou como sequer faria isso… Estou olhando aqui e não tô vendo nenhum código da commons-net pra me ajudar. Alguém também tem mais outra dica?

[]'s

R

Eu trabalho com FTP + Java usando a commons-net.

public IntegratorFTP() throws FTPException
{
	ftp = new FTPClient();
		
	try
	{
		ftp.connect("ip do ftp");
	}
	catch(IOException ex)
	{
		throw new FTPException("Não foi possível conectar-se ao FTP.");
	}
		
	if( FTPReply.isPositiveCompletion(ftp.getReplyCode()) )
	{
		try
		{
			ftp.login("usuario", "senha");
			ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
		}
		catch(IOException ex)
		{
			throw new FTPException("Não foi possível logar-se ao FTP.");
		}
	}
	else
	{
		throw new FTPException("Não foi possível conectar-se ao FTP.");
	}
}

Tenho essa classe IntegratorFTP para manipular as pastas do FTP. Exemplo: Quando quero criar um usuario novo, faço as configurações automáticas no FTP, já até usei para atualizar o código no servidor. É util...

Só não consegui trabalhar muito bem com endereços relativos, então para eu não me perder nas pastas do FTP tenho um método para sempre voltar para o raiz:

No caso minha raiz tem a pasta appservers. Então eu sei que estou no raiz...

private void voltarParaODiretorioRaiz() throws FTPException
{
	while(!estouNoRaiz)
	{
		try
		{
			ftp.changeToParentDirectory();
			
			FTPFile[] arquivos = ftp.listFiles();
			for(FTPFile arquivo : arquivos)
			{
				if(arquivo.getName().equals("appservers"))
				{
					estouNoRaiz = true;
				}
			}
		}
		catch(IOException ex)
		{
			throw new FTPException("Não foi possível voltar ao diretório raiz.");
		}
	}
}
Tenho este método para abrir um determinado caminho no FTP:
private void abrirPasta(String caminho) throws FTPException
{
	if(!estouNoRaiz)
		voltarParaODiretorioRaiz();
	
	try
	{
		ftp.changeWorkingDirectory(caminho);
		estouNoRaiz = false;
	}
	catch(IOException ex)
	{
		throw new FTPException("Erro ao abrir pasta de destino = " + caminho);
	}
}

Para enviar um arquivo para o FTP:

public void enviarArquivoe(File arquivo) throws FTPException
{
	abrirPasta("caminho ate a pasta que quero jogar o arquivo...");

	FileInputStream is = null;
	try 
	{
		is = new FileInputStream(arquivo);
	} catch (FileNotFoundException e) {
		throw new FTPException("Erro localizar o arquivo " + arquivo.getName());
	}
		
	try
	{
		if( !ftp.storeFile(arquivo.getName(), is) )
			throw new FTPException("Erro ao enviar arquivo: " + arquivo.getName() + " para o servidor.");	
	}
	catch(IOException ex)
	{
		throw new FTPException("Erro ao enviar arquivo: " + arquivo.getName() + " para o servidor.");
	}
}

Se tiver alguma dúvida posta ai ...

A

Opa,

Nao eh bem isso que eu quero. Vamos a um exemplo:

Usuario do sistema vai no Firefox, e digita ftp://ftp.sistema.com.br

Em seguida, abre o popup tradicional do firefox e ele digita o usuario e senha.

O sistema (no lado servidor) compara o usuario e a senha e ve se procedem com o usuario de acordo com o BD, nao de acordo com algum passwd

Alguem sabe?

[]`s

R

AUser:
Opa,

Nao eh bem isso que eu quero. Vamos a um exemplo:

Usuario do sistema vai no Firefox, e digita ftp://ftp.sistema.com.br

Em seguida, abre o popup tradicional do firefox e ele digita o usuario e senha.

O sistema (no lado servidor) compara o usuario e a senha e ve se procedem com o usuario de acordo com o BD, nao de acordo com algum passwd

Alguem sabe?

[]`s

Nesse caso não vou poder te ajudar…
Acho que nesse caso não tem nenhuma relação com o Java. Talvez alguma configuração no servidor FTP para redirecionar as requisições?

A

Acho que tem relacao sim com Java. Nem que seja sobrescrever algum metodo, usando um interceptor… Isso me cheira a Java sim… So nao achei nada em nenhum canto.

L

O que vc ta querendo é um servidor de FTP. Alguns servidores de FTP podem utilizar autenticação com MySQL, PostgreSQL, LDAP, etc.

A

opa lsjunior,

Beleza, mas vc conhece algo assim em Java? Tem algum link?

[]`s

R

Assim, acho que você não precisa gastar 1 linha de programação para isso. Como o pessoal disse, se já existe servidor de FTP que é integrado a banco de dados para fazer autenticação, tudo o que você precisa é configurar o servidor adequadamente para pedir autenticação. Provavelmente, navegadores que suportem ftp pedirão usuário e senha se a conexão pedir.

Se mesmo isso não te servir e você estiver com muita vontade programar, você deve vai precisar escrever um WebClient para FTP. Ou seja, você vai precisar escrever Servlets para autenticar o usuário, encaminhar requisições e enviar os downloads, sem falar na árvore de navegação. Bom, eu insistiria na resposta nro 1.

A

Opa,

Meu caro, o problema principal é justamente esse. A autenticação é o de menos, o problema é a hierarquia. Ela é variada de acordo com o usuário, basicamente, após o login eu não retornaria um /home/userName, mas sim uma lista, ex:
/
/home/userName
/usr/local/www
etc…

E outra, dentro de algum diretório desses, em algum caso eu não poderia retornar um diretório específico.

Além dessa hierarquia, também há a necessidade que eu retorne a permissão (esse usuário poderia r-- em /usr/local/www mas tb poderia retornar rw- em /home/userName … Eu pensei em criar links, mas além de ser porco ia ser praticamente impossível gerenciar essas permissões.

Alguém tem algo?

[]'s

Criado 26 de junho de 2011
Ultima resposta 27 de jun. de 2011
Respostas 10
Participantes 5