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;