quarta-feira, 19 de março de 2008

Baixando um arquivo com componente idHttp

Fala pessoal tudo bem ?

Bom como nossa amiga Marina pediu para que eu explicasse como fazer um sistema que baixe um arquivo utilizando o protocolo HTTP este será nosso assunto de hoje.

Bom vamos lá.

1- Crie um novo projeto no Delphi indo em File -> New VCL Forms Application.

2- Monte o visual do seu sistema com os seguintes componentes, um label com nome lblNomeArquivo com a propriedade Caption ‘Nome do Arquivo’, um Edit com nome edtNomeArquivo com a propriedade Readonly setada para true e Color para clBtnFace, um label com nome lblEnderecoArquivo com a propriedade Caption ‘Endereço do Arquivo’, um Edit com nome edtEnderecoArquivo, um buton com nome btBaixarArquivo com Caption ‘Baixar Arquivo’, um progressbar com nome pgrsArquivo propriedade smoth true.

3- Mude o nome do seu form para frmPrincipal propriedades BorderStyle para bsSingle, BorderIcons para [biSystemMenu,biMinimize] e Position para poDesktopCenter.

4- Agora coloque um componente idHttp com nome idHttp e um SaveDialog com nome svdArquivo.

Seu form deve ficar mais ou menos parecido com isto:

clip_image001

Ok com o visual montado vamos a parte divertida da coisa:

1- No evento OnChange do componente Edit com nome edtEnderecoArquivo coloque o seguinte código:

var
I: integer;
begin
  I := LastDelimiter('/',edtEnderecoArquivo.Text);
  edtNomeArquivo.Text := Copy(edtEnderecoArquivo.Text, I + 1, MaxInt);
end;

Explicando o código: A função LastDelimiter retorna a posição do ultimo delimitador de uma string , onde o delimitador deve ser informado em seu primeiro parâmetro, no nosso caso o delimitador é a ‘/’. Após armazenar a posição apenas copiamos para o edtNomeArquivo o texto iniciando da posição do ultimo delimitador.

2- O evento OnClick do botão btBaixarArquivo deve ficar como abaixo:

procedure TfrmPrincipal.btBaixarArquivoClick(Sender: TObject);
var
msArquivo: TMemoryStream;
begin
//Criamos a variavel msArquivo do tipo de um TMemoryStream para
//armazenarmos o arquivo enquanto esta sendo baixado.
msArquivo := TMemoryStream.Create;
try
  try
    //Fazemos o download do arquivo através do método Get do idHttp onde
    //passamos o endereço do arquivo no primeiro parâmetro e a variável do tipo
    //MemoyStream no segundo parâmetro.
    idHttp.Get(edtEnderecoArquivo.Text,msArquivo);
    //Mudamos agora a extensao do arquivo padrao do save dialog para a mesma do arquivo que foi baixado. 
    svdArquivo.DefaultExt := '*' + ExtractFileExt(edtNomeArquivo.Text)+'|' + ExtractFileExt(edtNomeArquivo.Text);
    //Mudamos o filtro tambem para o mesmo da extensao padrao
    svdArquivo.Filter := '*' + ExtractFileExt(edtNomeArquivo.Text)+'|' + ExtractFileExt(edtNomeArquivo.Text);
    //Setamos o nome do arquivo para o mesmo que foi baixado.
    svdArquivo.FileName := edtNomeArquivo.Text;
    //Mostramos o Save Dialog e Salvamos o arquivo.
    if svdArquivo.Execute then
      begin
       msArquivo.SaveToFile(svdArquivo.FileName);
       //Informamos que o arquivo foi salvo com sucesso
       Application.MessageBox('Arquivo salvo com sucesso !','Sucesso!',MB_OK+MB_ICONINFORMATION);
      end;
  except
   //Se ocorreu um erro então tratamos ele
   on E: EIdHttpProtocolException do
     begin
      
//Se não achou o arquivo entao mostra a mensagem.
       if E.ErrorCode = 404 then
        
Application.MessageBox('O arquivo solicitado não foi encontrado no servidor !',
                                                 'Erro arquivo não existe !',
                                                 MB_OK+ MB_ICONERROR);
     end;
  end;
finally
 
//Liberamos a variavel da memoria.
  FreeAndNil(msArquivo);
end;
end;

3- Agora no evento OnWorkBegin do idHttp coloque o seguinte código:

if AWorkCountMax > 0 then
  
pgrsArquivo.Max := AWorkCountMax;

4- E no evento OnWork coloque:

pgrsArquivo.Position := AWorkCount;

Bom acho que com isso já é possivel que vocês entendam como baixar um ou mais arquivos com o idHttp, caso tenham duvidas por favor coloque um comentario aqui que com certeza responderei ;)

Outra coisa o codigo fonte deste exemplo e o seu exe estão disponíveis no endereço http://www.unitone.com.br/arquivos/demoHttp.zip

Grande abraço a todos,
Diego M. Garcia

6 comentários:

Anônimo disse...

Bacana, fiz o teste, como era de se esperar deu certinho. agradeço mais uma vez sua atenção. Nota dez - Marina

Neo disse...

Muito bom, fiz aqui e deu certinho.
Vou incrementar mais ele colocando um botão para abortar o download, talvez algo que liste os arquivos de uma pasta de um site, vou testando, vlw pela dica.

Anônimo disse...

Amigo como faço para enviar o arquivo ao invél de receber? vc poderia postar o codigo fonte também?

Diego M. Garcia disse...

Bom para enviar o arquivo você precisa utilizar o ftp, para isso é necessário que você tenha uma conta de ftp no servidor com os devidos direitos de acesso.
Por padrão o protocolo Http suporta apenas a transferência do servidor para o cliente (navegador), é possivel fazer um site e programa em conjunto que permita a transferência via http porem é um pouco mais complexo devido ao fato da programação ter que ser feita tanto no programa que é executado no site (para saber como receber o arquivo) quanto no seu programa (para saber como enviar o arquivo).
Assim que eu tiver um tempinho posto aqui um artigo sobre como utilizar o ftp.
Abraço,
Diego M. Garcia

Anônimo disse...

Amigo DIEGO, ao abrir o seu programa no meu Delphi 5 deu mensagem que o IDHTTP component não existe. Ondo posso baixar este componente ?? se vc tiver por favor me remeta para cpms@ig.com.br. Abraço do amigo MARCOS, Natal-RN

Diego M. Garcia disse...

Oi Marcos, baixe do site http://www.indyproject.org

É o Indy Sockets (VCL), o delphi 5 por padrão não vem com o Indy instalado,apenas da versão 6 até a mais recente 2009.

Grande abraço, e muito obrigado por acompanhar o blog ;)

Diego Garcia