IdHttp - Connection closed Gracefully abfangen?
Moin !
Ich nutze den Code hier (ist hier aus der Code-Lib) um eine Datei von einem Server zu laden:
Delphi-Quellcode:
Manchmal bricht aber der Server die Verbindung ab und ich bekome eben "Connection closed gracefully". Kann mir jemand nen Tip geben wie ich das im Code abfangen muss / soll?
Function TInstallForm.DownloadFile(Filename : String) : Boolean;
var BytesKopiert, BytesInsgesamt : int64; lStream : TFileStream; FileToLoad : String; begin size.caption := ''; //Initialiesieren Status.Caption := ''; BytesKopiert := 0; Progress.Position := 0; //In edit 1 steht die downzuladene Datei (z.b. [url]http://www.server.com/datei.dat[/url]) Status.Caption := 'Prüfe Header'; // Durch die zwei nächsten Befehle wird die Größe ermittelt und ihn der Variable BytesInsgesamt abgespeichert FileToLoad := 'http://' + AppUpdateServer + '/' + AppUpdateFolder + '/' + AppName + ' ' + IntToStr(AppMajorVersion) + '/' + Filename; FileToLoad := StringReplace(FileToLoad, ' ', '%20', [rfReplaceAll, rfIgnoreCase]); // ShowMessage(FileToLoad); IdHTTP.Head( FileToLoad ); BytesInsgesamt := IdHTTP.Response.ContentLength; Log('Download : ' + AppName + ' ' + IntToStr(AppMajorVersion) + '/' + Filename, ClBlue); Log('HTTP Response : ' + Idhttp.Response.ResponseText, clBlack); Size.Caption := IntToStr(BytesInsgesamt); // Exit; //Wenn die Indy Komponente -1 zurückgibt dann bedeutet es des der die Dateigröße nicht zu verfügung //stellt uns somit kann die Datei ganz normall heruntergeladen werden (ohne Fortschrittsanzeige) if BytesInsgesamt = -1 then begin Status.Caption := 'Normalles herunterladen'; Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream := TFileStream.Create(TempFolder + Filename, fmCreate or fmShareDenyNone); try //und "normal" herunterladen idHTTP.Get(FileToLoad , lStream); finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt end; //Alles auf fertig stellen Status.Caption := 'Fertig'; SpeedLabel.caption := 'Fertig'; exit; end; //Also wenn wir hier angelangt sind dann bedeutet es der Server hat uns die Dateigröße zur Verfügung gestellt. Progress.Max := BytesInsgesamt; Status.Caption := 'Erstelle Datei'; //In Edit 2 steht welche Datei (z.b. C:\datei.dat) //Datei erstellen lStream := TFileStream.Create(TempFolder + Filename, fmCreate or fmShareDenyNone); lStream.Position := 0; try repeat // Damit sich das Programm nicht aufhängt Application.ProcessMessages; //Hier wird gebrüft ob die restlichen Bytes größer sind als cFileSplitSize if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then begin //Hier wird einmal die cFileSplitSize eingestellt IdHttp.Request.Range := Format('%d-%d', [BytesKopiert, (BytesKopiert+cFileSplitSize-1)]); end else IdHttp.Request.Range := Format('%d-', [BytesKopiert]); Application.ProcessMessages; //Den eingesttelten Teil herunterladen und ihn die Datei speichern IdHTTP.Get(FileToLoad , lStream); //Progress und Status aktualliesieren Progress.Position := BytesKopiert; Status.Caption := GetSizeName(BytesKopiert) + ' / ' + GetSizeName(BytesInsgesamt); //BytesKopiert weiter setzen BytesKopiert := BytesKopiert+cFileSplitSize; until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig finally if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt IdHttp.Request.Range := ''; end; //Alles auf fertig stellen Status.Caption := 'Fertig'; SpeedLabel.caption := 'Fertig'; Progress.Position := Progress.Max; end; procedure TInstallForm.IdHTTPWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin if not((GetTickCount - FTime) <= 0) then begin try SpeedLabel.caption := Format('%.2f KB/s', [(AWorkCount - FBytes) / (GetTickCount - FTime)]); except end; end; FTime := GetTickCount; FBytes := AWorkCount; Application.ProcessMessages; end; procedure TInstallForm.IdHTTPWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); begin FTime := GetTickCount; FBytes := 0; Application.ProcessMessages; end; Muss ich das "IdHTTP.Get(FileToLoad , lStream);" mit Try Except umklammern? |
Re: IdHttp - Connection closed Gracefully abfangen?
Zitat:
Also z.B.
Delphi-Quellcode:
try
... ... except on E:EIdConnClosedGracefully do begin ... end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz