Fazendo Download e Upload usando FTP com Delphi

2 comentários
Tudo bom pessoal? Bem, hoje precisei começar uma implementação no trabalho, e preciso desenvolver um sistema que conecte em um FTP de forma que fique invisivel para o usuario. Pesquisei um pouco e decidi fazer em delphi pela facilitade. Achei um tutorial bem bacana no blog de um cara Bacharel em Ciencias da Computação, bem legal. Segue ai o blog do carinha. http://balaiotecnologico.blogspot.com.br
Então rola a pagina ai e presta atenção no tutorial ;)

O Delphi vem incluindo há bastante tempo em sua paleta de componentes o tratamento para um amplo conjunto de protocolos. Esses componentes são o produto de um projeto Open Source chamado Indy Internet Direct e estão disponíveis para várias plataformas de desenvolvimento - Delphi, C++, C#, etc. Eles encapsulam os detalhes de mais baixo nível do funcionamento de cada protocolo, simplificando bastante a sua utilização. Há componentes para considerar ambos os lados de uma comunicação, permitindo a criação tanto de aplicações servidoras em relação a um protocolo quanto aquelas que serão apenas Clients, isto é, consumidoras do serviço provido por um servidor.

No caso do FTP, vou me ater ao componente TIdFTP, que implementa o lado Client de uma comunicação para transferência de arquivos. O componente tem métodos para tratar os comandos inerentes a um Client FTP; portanto, a mesma instância pode tratar tanto o envio quanto o recebimento de arquivos, dentre outras possibilidades.

Qualquer que seja a operação desejada, o primeiro passo tem que ser a conexão com um servidor. O exemplo abaixo preenche as propriedades mais importantes do FTP:


IdFTP1.Disconnect(); IdFTP1.Host := 'ftp.abc71.com.br'; IdFTP1.Port := 21; IdFTP1.Username := 'usuario_para_login'; IdFTP1.Password := 'senha'; IdFTP1.Passive := false; { usa modo ativo } IdFTP1.RecvBufferSize := 8192; try { Espera até 10 segundos pela conexão } IdFTP1.Connect(true, 10000); except on E: Exception do _Erro = E.Message; end;


 Os parâmetros Host e Port identificam o endereço do servidor FTP com o qual queremos conectar. O Username e a Password servem para fazer o login naquele servidor; são informações que você deve conhecer previamente - aqui, os dados fornecidos são apenas exemplos. Alguns servidores permitem que se conecte anonimamente; para isso é recomendado que se informe um endereço de email em Password. Caso você esteja tentando fazer a conexão a partir de um computador que só se conecta na rede através de um proxy, use a propriedade ProxySettings para complementar as configurações.

O valor de RecvBufferSize indica o tamanho do buffer interno para a recepção de dados; normalmente, ele não precisa ser alterado. Finalmente, a função Connect faz todo o trabalho para estabelecer a conexão, aguardando um tempo máximo especificado na própria função. O primeiro parâmetro passado a ela indica se o login deve ocorrer junto com a conexão. Se optar por não fazer o login neste momento, você terá que chamar manualmente a função Login.

Com a conexão estabelecida e o login feito com sucesso, enviar um arquivo (fazer o upload) é bastante simples. Basta chamar a função Put do TIdFTP:

IdFTP1.Put (AFileName, ADstFileName, false);
O primeiro parâmetro é o nome completo do arquivo que você quer mandar, incluindo o caminho. O segundo parâmetro é como o arquivo será nomeado no servidor, isto é, o seu arquivo pode ser enviado com um nome diferente. Para mantê-lo com o mesmo nome no servidor, simplesmente passe um texto vazio no lugar. Para mandar para uma pasta específica no servidor, informe o nome dela como parte do nome do arquivo. O componente FTP também possui métodos para navegar pela árvore de pastas, criar uma nova pasta e listar as pastas atualmente existentes, caso seja necessário. O último parâmetro passado ao Put sinaliza ao servidor o que fazer caso um arquivo com o mesmo nome já exista. Informar true fará com que o servidor inclua o conteúdo do seu arquivo no final do arquivo já existente.

Fazer o download de um arquivo também é simples. Basicamente, chame a função Get do TIdFTP:

IdFTP1.Get (AFileName, ADstFileName, true, false);
Aqui a situação é invertida em relação ao Put. O nome de arquivo passado no primeiro parâmetro identifica um arquivo no servidor, enquanto o segundo parâmetro é o nome com o qual queremos salvá-lo localmente. O terceiro parâmetro determina se o download sobreporá ou não um arquivo local que tenha o mesmo nome. Por fim, o último parâmetro indica se o download deve tentar prosseguir a partir do ponto onde uma tentativa anterior tenha sido interrompida.

Quando terminar o uso do componente, é conveniente chamar o método Quit para encerrar a conexão e devolver os recursos usados pelo sistema operacional.

As operações Get e Put podem ser bastante demoradas, dependendo do tamanho do arquivo sendo transferido. Então, para evitar que a aplicação pareça travada, é possível responder a alguns eventos no TIdFTP para dar ao usuário um retorno sobre o andamento da operação. O evento OnStatus notifica o programa a respeito de mudanças no estado da conexão. Já os eventos OnWorkBegin, OnWork e OnWorkEnd tratam do progresso da transferência do arquivo, informando o tamanho esperado do trabalho, a evolução da quantidade de bytes transferida enquanto a operação está em andamento e, por fim, sinalizando a conclusão da transferência. Com isso, podemos, por exemplo, incluir uma barra de progresso na tela para acompanhar toda a operação.

2 comentários :

  1. Estou com problemas neste componente, estou enviando vários arquivos e a conexão é interrompida, e neste caso apresenta um erro, tento testar antes do put para ver se está conectado (if idftp1.connected) e a resposta é sempre true, precisava saber antes do put se a conexão ainda está ativa.

    obrigado.

    ResponderExcluir
    Respostas
    1. Opa cara, ja tentou testar com outro servidor FTP? pode ser o seu servidor que nao esta suportando a quantidade de arquivos. Se der posta aqui o teu code pra mim tentar te ajudar!

      Excluir