Dateien mithilfe der Indy über das HTTP-Protokoll downloaden
Um eine Datei über das HTTP-Protokoll übertragen zu können, platzieren Sie die TidHTTP-Komponente auf dem Formular. Für die Übertragung gibt es zwei Versionen der Methode „Get“. Die eine Version gibt den Inhalt einfach als String zurück, sie eignet sich gut für HTML/Text-Dateien:
procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Text:=idHTTP1.Get('http://www.delphi-treff.de'); end;
Die andere Version erwartet als zweiten Parameter einen TStream-Abkömmling. Diese Variante ist besser für den Download von z.B. ZIP-Archiven, PDF-Dateien, JPEGs usw. geeignet:
procedure TForm1.Button1Click(Sender: TObject); var lStream: TFileStream; begin lStream:=TFileStream.Create('C:\Datei.zip', fmCreate or fmShareDenyNone); try idHTTP1.Get('http://www.delphi-treff.de/Datei.zip', lStream); finally lStream.Free; end; end;
Sollte der Benutzer ggf. über einen Proxy ins Internet gehen, können entsprechende Einstellungen über die Eigenschaft ProxyParams getätigt werden.Bei der Übertragung von Daten kann es natürlich zu Fehlern kommen. Da gibt es u.a. die aus jedem Browser bekannten HTTP-Fehlern, wie 404 (Datei nicht gefunden), 403 (Zugriff verweigert) oder 500 (Internal Server Error). Mithilfe eines try-except-Blocks können diese Fehler abgefangen werden:
procedure TForm1.Button1Click(Sender: TObject); begin try Memo1.Text:=idHTTP1.Get('http://www.delphi-treff.de'); except On E: EIdHTTPProtocolException do Showmessage('HTTP-Fehler: '+IntToStr(E.ReplyErrorCode)); On E: EIdSocketError do Showmessage(E.Message); end; end;
Damit die Anwendung bei der Übertragung größerer Dateien nicht einfriert, empfiehlt es sich, zusätzlich die Komponente IdAntiFreeze aufs Formular zu setzen.