Download via HTTP com Synapse
Synapse é uma excelente biblioteca de comunicação TCP/IP síncrona freeware e open-source para Delphi. Com ela é fácil fazer downloads de qualquer tipo de arquivo via HTTP. Vou mostrar rapidamente como baixar e gravar arquivos, obter imagens JPEG e strings. De quebra, uma função para obter seu endereço IP externo.
Synapse é puro código. Não tem componentes visuais e não precisa ser instalada. Tudo o que você precisa fazer para usar as funções abaixo é incluir a unit “httpsend” na cláusula uses e começar a usar as suas classes e rotinas (não deixe de incluir o caminho para “synapse\source” no seu “Search Path”).
A classe THTTPSend usa apenas o método HTTPMethod para fazer conexões GET e POST no protocolo HTTP. Mais simples ainda é usar as procedures HttpGetText e HttpGetBinary. HttpGetText traz o conteúdo de uma URL em formato texto através de um objeto TStrings. Você pode usar qualquer descendente, como um TStringList ou a propriedade Lines de um objeto TMemo.
function HttpGetText(const URL: string; const Response: TStrings): Boolean;
Já HttpGetBinary retorna o conteúdo binário de uma URL em um objeto TStream. Por conteúdo binário entenda qualquer tipo de arquivo: JPG, TXT, WMV, CSS, PDF, ZIP… Você pode usar qualquer tipo de objeto descendente de TStream, como TFileStream ou TMemoryStream, ou mesmo o stream de um campo TBlobField.
function HttpGetBinary(const URL: string; const Response: TStream): Boolean;
GetFile, GetImage e GetString
Eu tenho algumas próprias rotinas que facilitam ainda mais a vida. Nessas rotinas você pode observar exemplos de uso das funções nativas da Synapse.
A primeira é HttpGetFile, que salva um arquivo dada a sua URL:
uses httpsend; function HttpGetFile(const URL: String; const FileName: String): Boolean; var Stream: TFileStream; begin Stream := TFileStream.Create(FileName, fmCreate); try Result := HttpGetBinary(URL, Stream); finally Stream.Free; end; end;
Simples, não é?
Outra legal é HttpGetImage, que retorna um objeto TPicture contendo um arquivo de imagem JPEG baixado direto da Internet
uses httpsend, jpeg; function HttpGetImage(const URL: String; Graphic: TPicture): Boolean; var Stream: TMemoryStream; Image: TJPEGImage; begin Stream := TMemoryStream.Create; try if HttpGetBinary(URL, Stream) then begin Image := TJPEGImage.Create; try Stream.Seek(0, soFromBeginning); Image.LoadFromStream(Stream); Graphic.Assign(Image); finally Image.Free; end; end; finally Stream.Free; end; end;
Experimente usar direto em um componente visual TImage:
HttpGetImage(URL, Image1.Picture);
Quando você quiser ler uma página como uma String, use HttpGetString:
uses httpsend; function HttpGetString(const URL: String): String; var Strings: TStringList; begin Strings := TStringList.Create; try if HttpGetText(URL, Strings) then Result := Strings.Text else Result := ''; finally Strings.Free; end; end;
Uma aplicação interessante dessa última rotina é pegar o seu endereço IP externo (fora da rede local, com seu NAT) através do serviço CheckIP da DynDNS.com. Tudo que eu faço é pegar o output HTML da página e deixar apenas o valor do IP.
function ExternalIP: String; var Response: String; Start, Finish: Integer; begin Response := HttpGetString('http://checkip.dyndns.com/'); Start := Pos(': ', Response) + 2; Finish := Pos('</body>', Response); Result := Copy(Response, Start, Finish - Start); end;
Comments
Deixe uma Resposta
