AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem mit IdHTTP.get mit Fortschrittsanzeige
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit IdHTTP.get mit Fortschrittsanzeige

Ein Thema von dominikkv · begonnen am 30. Jun 2007 · letzter Beitrag vom 1. Jul 2007
Antwort Antwort
Seite 1 von 2  1 2      
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#1

Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 30. Jun 2007, 21:46
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
Dominik
  Mit Zitat antworten Zitat
Benutzerbild von gsh
gsh

Registriert seit: 24. Okt 2004
1.542 Beiträge
 
Delphi XE Architect
 
#2

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 1. Jul 2007, 11:40
was ist das den für ein server?
unterstützt der forgesetztes downloaden?
ich nehme an du nutzt indy 10 oder?
Alex
"Sage nicht alles, was du weißt, aber wisse alles, was du sagst!" Matthias Claudius
"Wer sich über Kritik ärgert, gibt zu, daß er sie verdient hat." Tacitus
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 1. Jul 2007, 11:45
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#4

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 1. Jul 2007, 11:55
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 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
Dominik
  Mit Zitat antworten Zitat
Benutzerbild von arbu man
arbu man

Registriert seit: 3. Nov 2004
Ort: Krefeld
1.108 Beiträge
 
Delphi 7 Professional
 
#5

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 1. Jul 2007, 11:59
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
Angehängte Dateien
Dateityp: dfm unxdhttpprogresswindow_203.dfm (984 Bytes, 9x aufgerufen)
Dateityp: pas unxdhttpprogresswindow_774.pas (1,7 KB, 20x aufgerufen)
Björn
>> http://bsnx.net <<
Virtual DP Stammtisch v1.0"iw" am 19.09.2007 - ich war dabei!
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 1. Jul 2007, 12:03
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]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 1. Jul 2007, 14:13
hmmm... ok, ich werds ohne Fortschrittsanzeige machen^^
danke an alle die sich die mühe gemacht haben mir zu helfen

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
Dominik
  Mit Zitat antworten Zitat
Benutzerbild von arbu man
arbu man

Registriert seit: 3. Nov 2004
Ort: Krefeld
1.108 Beiträge
 
Delphi 7 Professional
 
#8

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 1. Jul 2007, 14:18
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
Björn
>> http://bsnx.net <<
Virtual DP Stammtisch v1.0"iw" am 19.09.2007 - ich war dabei!
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 1. Jul 2007, 14:27
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'
Dominik
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Problem mit IdHTTP.get mit Fortschrittsanzeige

  Alt 1. Jul 2007, 15:36
Ähm. Okay. Da ist jemand Designerabhängig xD

du musst die events in ne klasse packen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 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