Integrar FTP com Java

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!

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.

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

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

[code]
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.");
}

}[/code]

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…

[code]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.");
	}
}

}[/code]

Tenho este método para abrir um determinado caminho no FTP:

[code]
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);
}

}[/code]

Para enviar um arquivo para o FTP:

[code]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.");
}

}[/code]

Se tiver alguma dúvida posta ai …

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

[quote=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[/quote]

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?

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.

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

opa lsjunior,

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

[]`s

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.

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