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:
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