Fazendo Download e Upload usando FTP com Delphi
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.
Assinar:
Postar comentários
(
Atom
)
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.
ResponderExcluirobrigado.
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