Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit IdHTTP.get mit Fortschrittsanzeige (https://www.delphipraxis.net/95100-problem-mit-idhttp-get-mit-fortschrittsanzeige.html)

dominikkv 30. Jun 2007 20:46


Problem mit IdHTTP.get mit Fortschrittsanzeige
 
Hi

ich bin grad dabei mir nen updater zu schreiben.
Zum downloaden mit Fortschrittsanzeige über IdHTTP.get hab ich hier ne Function gefunden, die ich leicht umgeändert habe:

Delphi-Quellcode:
function Downloaden(Source: String): Boolean;
var
  BytesKopiert, BytesInsgesamt : int64;
  lStream: TFileStream;
  con: TextFile;
begin
  AssignFile(con, 'CON:');
  Rewrite(con);

  Write(con, Source + ' wird heruntergeladen... ');
  BytesKopiert := 0;

  IdHTTP1.Head('http://server.de/'+Source);
  BytesInsgesamt := IdHTTP1.Response.ContentLength;
  if BytesInsgesamt = -1 then
  begin
    lStream:=TFileStream.Create(AppPath + Source, fmCreate or fmShareDenyNone);
    try
      idHTTP1.Get('http://server.de/'+Source, lStream);
    finally
      if Assigned(lStream) then lStream.Free;
    end;
    Write(con, #13, Source + ' wird heruntergeladen... OK' + CR);
    CloseFile(con);
    exit;
  end;

  lStream:=TFileStream.Create(AppPath + Source, fmCreate or fmShareDenyNone);
  lStream.Position := 0;
  try
    repeat
      if (BytesInsgesamt-BytesKopiert) > cFileSplitSize then
      begin
        IdHttp1.Request.Range := Format('%d-%d', [BytesInsgesamt, (BytesKopiert+cFileSplitSize-1)]);
      end else
        IdHttp1.Request.Range := Format('%d-', [BytesKopiert]);

      Application.ProcessMessages;

      IdHTTP1.Get('http://server.de/'+Source, lStream); // <-- Hier tritt das Problem auf
      BytesKopiert := BytesKopiert+cFileSplitSize;
      Write(con, #13, Source + ' wird heruntergeladen... ', GetSizeName(BytesKopiert)+'/'+GetSizeName(BytesInsgesamt), ' [', FloatToStr((BytesKopiert/BytesInsgesamt)*100), '%]');
    until (BytesKopiert >= BytesInsgesamt);
  finally
    if Assigned(lStream) then lStream.Free;
    CloseFile(con);
  end;
  Write(con, #13, Source + ' wird heruntergeladen... ', GetSizeName(BytesInsgesamt), ' OK', CR);
end;
Das Problem ist folgende Fehlermeldung:

Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Updater.exe ist eine Exception der Klasse EIdHTTPProtocolException mit der Meldung 'HTTP/1.1 416 Requested Range Not Satisfiable' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Die Stelle wo das Problem auftritt hab ich oben im Quelltext gekennzeichnet.
Das Programm ist eine Konsolenanwendung, und wenn ich die Datei ohne Fortschrittsanzeige runterlade:

Delphi-Quellcode:
  lStream := TFileStream.Create(AppPath + Source, fmCreate);
  IdHTTP1.Get('http://server.de/'+Source, lStream);
  lStream.free;
gehts...

was mach ich falsch?

mfg.Dominik

gsh 1. Jul 2007 10:40

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige
 
was ist das den für ein server?
unterstützt der forgesetztes downloaden?
ich nehme an du nutzt indy 10 oder?

SirThornberry 1. Jul 2007 10:45

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige
 
nur wegen der Fortschrittsanzeige lädst du in mehreren Stücken herunter? Lade doch in einem stück runter dann hast du auch nicht das Problem das es nicht funktioniert wenn der Server es nicht unterstützt.

dominikkv 1. Jul 2007 10:55

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige
 
Zitat:

Zitat von gsh
was ist das den für ein server?
unterstützt der forgesetztes downloaden?
ich nehme an du nutzt indy 10 oder?

server ist von www.funpic.de, hier der direktlink zum ordner wo die dateien zum downloaden liegen.
Ja, Indy 10 wird benutzt.
Ob der Server fortgesetztes downloaden unterstützt weiß ich net :(

Zitat:

Zitat von SirThornberry
nur wegen der Fortschrittsanzeige lädst du in mehreren Stücken herunter? Lade doch in einem stück runter dann hast du auch nicht das Problem das es nicht funktioniert wenn der Server es nicht unterstützt.

Wär halt schön wenn man weiß wie weit er schon gedownloaded hat...
Muss aber nicht unbedingt sein ;)

arbu man 1. Jul 2007 10:59

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige
 
Liste der Anhänge anzeigen (Anzahl: 2)
Halt Falsch:

Es gibt doch die Ereignisse: onWork,Begin,End. Die einfach benutzen.

Im Anhang findest du eine Form, die Proceduren bereit stellt, die dann nur noch von deinen TIdHTTP aufgerufen werden müssen, und schon hast du einen Fortschritt im wahrsten Sinne des Wortes :)

SirThornberry 1. Jul 2007 11:03

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige
 
und falls dir die OnWork-Ereignisse zu selten kommen oder ungenau sind kannst du auch einfach eine eigene Streamklsse ableiten und die Write-Methode überschreiben um zu zählen wieviel schon geschrieben wurde (hab ich auch mal ein Beispiel gepostet)

[Edit]
hier der link:
http://www.delphipraxis.net/internal...=563250#563250
[/Edit]

dominikkv 1. Jul 2007 13:13

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige
 
hmmm... ok, ich werds ohne Fortschrittsanzeige machen^^
danke an alle die sich die mühe gemacht haben mir zu helfen :cheers:

noch eine kleine frage, ich will dafür nicht extra nen neuen thread aufmachen:
mein updater wird aus dem hauptprogramm mit shellexecute mit sw_Hide aufgerufen, dann ist die Konsole ja nicht sichtbar.
wenn jetzt aber ein update verfügbar ist will ich die konsole wieder anzeigen... wie geht das?

mfg.Dominik

arbu man 1. Jul 2007 13:18

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige
 
Warum es geht doch mit Fortschritts anzeige du muss nur die Events TIdHTTP.OnWork, TIdHTTP.OnWorkBegin und TIdHTTP.OnWorkEnd nutzen und schon bis du fertig.

mfg, Björn

dominikkv 1. Jul 2007 13:27

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige
 
Zitat:

Zitat von arbu man
Warum es geht doch mit Fortschritts anzeige du muss nur die Events TIdHTTP.OnWork, TIdHTTP.OnWorkBegin und TIdHTTP.OnWorkEnd nutzen und schon bis du fertig.

mfg, Björn

ja schon, nur das ist ja ne konsolenanwendung, und wenn ich das so mache:

Delphi-Quellcode:
procedure IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCountMax: Integer);
begin
   // Test
end;


IdHTTP1.OnWorkBegin := IdHTTP1WorkBegin; // <--
kommt an der markierten Stelle folgende fehlermeldung:
Zitat:

[DCC Fehler] Updater.dpr(304): E2009 Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'

DGL-luke 1. Jul 2007 14:36

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige
 
Ähm. Okay. Da ist jemand Designerabhängig xD

du musst die events in ne klasse packen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 Uhr.
Seite 1 von 2  1 2      

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