Einzelnen Beitrag anzeigen

polarwolf

Registriert seit: 6. Jan 2008
Ort: Bei Hamburg
10 Beiträge
 
Delphi 7 Personal
 
#7

Re: Indy Http Download+Fortschritt als Funktion geht nicht

  Alt 26. Feb 2008, 20:53
Ich habe das programm zum laufen bekommen und das auch mit mehr als 2 Dateien.

Bei mir war das Problem, dass der Header anscheinend nicht neu geladen werden konnte weil der alte noch drine war.
Beim neuladen ga es eine Fehlermeldung.
Also habe ich

idhttp.Request.Clear; vor

idhttp.Head(meineurlplusdatei); gepackt


Für die Copy - Paste Programmierer Hier meine lösung

Delphi-Quellcode:
//Initialiesieren
  Status.Caption := '';
  BytesKopiert := 0;
  Progress.Position := 0;
  Status.Caption := 'Prüfe Header';
  // Durch die zwei nächsten Befehle wird die Größe ermittelt und ihn der Variable BytesInsgesamt abgespeichert
  idhttp.Request.Clear;
  IdHTTP.Head(meineurlplusdatei);
  BytesInsgesamt := IdHTTP.Response.ContentLength;
  //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';
    //Datei erstellen
    lStream:=TFileStream.Create(Hauptprogrammpfadplusdatei, fmCreate or fmShareDenyNone);
    try
      //und "normal" herunterladen
      idHTTP.Get(meineurlplusdatei, 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';
  //Datei erstellen
  lStream:=TFileStream.Create(Hauptprogrammpfadplusdatei, 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
      IdHTTP.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
        IdHTTP.Request.ContentRangeEnd := BytesKopiert+cFileSplitSize-1;
      end
      //Den rest der Datei
      else IdHTTP.Request.ContentRangeEnd := BytesInsgesamt;
      Application.ProcessMessages;
      //Den eingesttelten Teil herunterladen und ihn die Datei speichern
      IdHTTP.Get(meineurlplusdatei, lStream);
      //BytesKopiert weiter setzen
      BytesKopiert := BytesKopiert+cFileSplitSize;

      //Progress und Status aktualliesieren
      Progress.Position := BytesKopiert;
      Status.Caption := GetSizeName(BytesKopiert)+'/'+GetSizeName(BytesInsgesamt);
    until (BytesKopiert >= BytesInsgesamt); //Schleife beenden wenn datei fertig
  finally
    if Assigned(lStream) then lStream.Free; //FileStream freigeben wenn gesetzt
  end;
  //Alles auf fertig stellen
  Status.Caption := 'Fertig';
  SpeedLabel.caption := 'Fertig';
  Progress.Position := BytesInsgesamt;
Martin
  Mit Zitat antworten Zitat