var
BytesKopiert, BytesInsgesamt : int64;
lStream: TFileStream;
begin
Panel1.Visible := true;
//Initialiesieren
Label22.Caption := '
';
BytesKopiert := 0;
ProgressBar2.Position := 0;
//In edit 1 steht die downzuladene Datei (z.b. [url]http://www.server.com/datei.dat[/url])
Label22.Caption := '
Prüfe Header';
// Durch die zwei nächsten Befehle wird die Größe ermittelt und ihn der Variable BytesInsgesamt abgespeichert
HTTP.Response.Clear;
HTTP.Head(Edit3.Text);
BytesInsgesamt := HTTP.Response.ContentLength; <-----
//HTTP/1.1 404 Error//
//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
Label22.Caption := '
Normalles herunterladen';
Label23.Caption := '
Erstelle Datei';
//In Edit 2 steht welche Datei (z.b. C:\datei.dat)
//Datei erstellen
lStream:=TFileStream.Create(Edit2.Text, fmCreate
or fmShareDenyNone);
try
//und "normal" herunterladen
HTTP.Get(Edit3.Text, lStream);
finally
if Assigned(lStream)
then lStream.Free;
//FileStream freigeben wenn gesetzt
end;
//Alles auf fertig stellen
Label22.Caption := '
Fertig';
Label23.caption := '
Fertig';
ProgressBar2.Position := 100;
Panel1.Visible := false;
exit;
end;
//Also wenn wir hier angelangt sind dann bedeutet es der Server hat uns die Dateigröße zur Verfügung gestellt.
ProgressBar2.Max := BytesInsgesamt;
Label23.Caption := '
Erstelle Datei';
//In Edit 2 steht welche Datei (z.b. C:\datei.dat)
//Datei erstellen
lStream:=TFileStream.Create(Edit2.Text, fmCreate
or fmShareDenyNone);
lStream.Position := 0;
try
repeat
// Damit sich das Programm nicht aufhängt
Application.ProcessMessages;
//Nun setzen wir den Start nach die bereits kopierten Bytes
HTTP.Request.ContentRangeStart := BytesKopiert;
//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
HTTP.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1;
end
//Den rest der Datei
else HTTP.Request.ContentRangeEnd := BytesInsgesamt;
Application.ProcessMessages;
//Den eingesttelten Teil herunterladen und ihn die Datei speichern
HTTP.Get(Edit2.Text, lStream);
//Progress und Status aktualliesieren
ProgressBar2.Position := BytesKopiert;
Label22.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
end;
//Alles auf fertig stellen
Label22.Caption := '
Fertig';
Label23.caption := '
Fertig';
ProgressBar2.Position := 100;
Panel1.Visible := false;
end;