Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Download ohne Cache? (https://www.delphipraxis.net/109497-download-ohne-cache.html)

mohikaner13 2. Mär 2008 19:01


Download ohne Cache?
 
Hallo,

ich habe ein Problem beim runterladen einer JPG-Grafik von einer Webcam. Mit dem Code

Delphi-Quellcode:
if DownloadFile('http://192.168.0.20/IMAGE.JPG', progPath + '/akBild.jpg') = true
    then
      begin
        Status.Caption := 'Datei geladen! ' + FormatDateTime('hh:nn:ss', now);
      end
    else
      begin
        Status.Caption := 'Datei nicht geladen! ' + FormatDateTime('hh:nn:ss', now);
      end;
bekomme ich ohne Probleme die aktuelle Ansicht der Webcam runtergeladen.
Diese kann ich auch durch direkten Aufruf der URL im Browser anzeigen.
Klicke ich im Browser auf RELOAD, dann erhalte ich auch das (nächste) aktuelle Bild.

Rufe ich den obigen Code aber mittels Timer mehrfach auf, so wird mir immer das gleiche Bild heruntergeladen (ich vermute aus dem lokalen CACHE??).

Weis jemand, wie ich das verhindern kann, so dass ich auch mit dem Code oben immer das aktualisierte Bild laden kann?

Danke schon mal vorab.

MrKnogge 2. Mär 2008 19:52

Re: Download ohne Cache?
 
Lösch doch einfach das Bild im Cache.

mohikaner13 2. Mär 2008 20:15

Re: Download ohne Cache?
 
Gar keine schlechte Idee - aber wie kann ich rauskriegen, wie das Bild im Cache heist? Falls das überhaupt mein Problem ist, das ist ja nur eine Vermutung. Wenn ich den Cache im Browser lösche, dann zeigt mir das (dabei im Hintergrund weiterlaufende) Programm immer noch das alte Bild an. Nur wenn ich das Programm neu starte, wird das neue Bild geladen.

Evtl. liegt es auch nicht am Cache des Browsers, sondern an der Funktion selbst?

Weitere Ideen?

marabu 2. Mär 2008 20:20

Re: Download ohne Cache?
 
Herzlich willkommen in der Delphi-PRAXiS, Jörg.

Was verbirgt sich hinter deiner Funktion Download()?
Die API Funktion UrlDownloadToFile() umgeht den Cache des IE.
Vielleicht liegt es an der Art wie du anzeigst, wenn immer das gleiche Bild zu sehen ist...

Freundliche Grüße

fLaSh11 2. Mär 2008 20:22

Re: Download ohne Cache?
 
Ich kann dir zwar mit deinem Problem nicht weiterhelfen, trotzdem möchte ich dich auf einen Fehler im Code aufmerksam machen:

Der Schrägstrich für Verzeichnisse ist ein Backslash. Nicht "/" wie bei einer URL, sondern "\".

Zitat:

Zitat von mohikaner13
Delphi-Quellcode:
{...} + '\akBild.jpg') {...}


mohikaner13 2. Mär 2008 20:44

Re: Download ohne Cache?
 
Hallo,

@fLaSh11: danke für den Hinweis, die Datei wird trotzdem korrekt gespeichert, das scheint die Funktion bzw. Windows(?) nicht zu stören - ich hab's trotzdem korrigiert.

@marabu:
Danke für den Willkommensgruß, da habe ich doch tatsächlich den falschen Codeausschnitt eingefügt.
Hier ist die Funktion dazu (ich benutze also wie von Dir angesprochen UrlDownloadToFile()) trotzdem (oder gerade deswegen) verstehe ich nicht, warum erst nach einem Programmneustart das wirklich aktuelle Bild geladen wird.

Delphi-Quellcode:
function TForm1.DownloadFile(Source, Dest: string): Boolean;
  { Function for Downloading the file found on the net }
begin
  try
    Result := UrlDownloadToFile(nil, PChar(Source), PChar(Dest), 0, nil) = 0;
  except
    Result := False;
  end;
end;
Vielleicht nutzt der Befehl einen "internen" Cache? Die Bildgröße ändert sich nämlich nicht (zumindest nicht, wenn keine großen Veränderungen im Bild auftreten - wie im Moment, das Bild ist nämlich zur Zeit wegen Dunkelheit gerade ziemlich schwarz).

Ein neues Bild kann man trotzdem gut erkennen, da das Bild ein Grundrauschen enthält, das von Aufnahme zu Aufnahme deutlich sichtbar wechselt.

In meiner Hilfe finde ich zu URLDownloadtoFile keine Information - gibt es dazu irgendwo eine Info?

Christian Seehase 2. Mär 2008 21:45

Re: Download ohne Cache?
 
Moin Zusammen,

@Mohikaner:
Das eigentliche Problem muss, wenn Du den Cache des IE gelöscht hast, und trotzdem das alte Bild angezeigt wird, an einer anderen Stelle im Code liegen.
Allerdings verwendet UrlDownloadToFile den Cache, und solange die URL gleich bleibt, und die Gültigkeit der Datei im Cache nicht abgelaufen ist, wird das Bild aus dem Cache geladen.

@Steffen:
Zitat:

Zitat von fLaSh11
Ich kann dir zwar mit deinem Problem nicht weiterhelfen, trotzdem möchte ich dich auf einen Fehler im Code aufmerksam machen:

Der Schrägstrich für Verzeichnisse ist ein Backslash. Nicht "/" wie bei einer URL, sondern "\".

Das ist kein Fehler, da das Dateisystem beide, also \ und / als Pfadtrennzeichen akzeptiert (das ist übrigens im SDK auch so dokumentiert).
Die eine oder andere Funktion in Delphi hat damit zwar ein Problem (z.B. ExtractFilePath), aber das ist dann ein Fehler der jeweiligen Funktion ;-)

@marabu:
Zitat:

Zitat von marabu
Die API Funktion UrlDownloadToFile() umgeht den Cache des IE.

Das tut sie, meiner Erfahrung nach, leider nicht, weshalb ich in so einem Falle die Indys (TidHTTP) zu verwenden.

mohikaner13 2. Mär 2008 21:58

Re: Download ohne Cache?
 
Hallo,

ich würde jetzt wegen dieses Problems nur ungern irgendeine Komponentensammlung installieren.

@Christian Seehase: woher hast Du Deine Informationen bezgl. der Funktion URLDownLoadtoFile? gibt es dazu eine Dokumentation oder hast Du die Quellen mit Header?

Ich habe bei den Schweizern folgenden Code gefunden, der den Cache umgehen soll (das habe ich aber noch nicht ausprobiert). Aber der schreibt die heruntergeladenen Datei in die Variable 's'. Wie kann ich diese Variable bzw. die Datei dann als Image auf die Festplatte (oder alternativ in eine Image-Komponente) schreiben?

Oder hat jemand noch eine andere Idee?

Delphi-Quellcode:
3. Forces a download of the requested file, object, or directory listing from the origin server,
    not from the cache
}

function DownloadURL_NOCache(const aUrl: string; var s: String): Boolean;
var
  hSession: HINTERNET;
  hService: HINTERNET;
  lpBuffer: array[0..1024 + 1] of Char;
  dwBytesRead: DWORD;
begin
  Result := False;
  s := '';
  // hSession := InternetOpen( 'MyApp', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
  hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  try
    if Assigned(hSession) then
    begin
      hService := InternetOpenUrl(hSession, PChar(aUrl), nil, 0, INTERNET_FLAG_RELOAD, 0);
      if Assigned(hService) then
        try
          while True do
          begin
            dwBytesRead := 1024;
            InternetReadFile(hService, @lpBuffer, 1024, dwBytesRead);
            if dwBytesRead = 0 then break;
            lpBuffer[dwBytesRead] := #0;
            s := s + lpBuffer;
          end;
          Result := True;
        finally
          InternetCloseHandle(hService);
        end;
    end;
  finally
    InternetCloseHandle(hSession);
  end;
end;

toms 3. Mär 2008 05:49

Re: Download ohne Cache?
 
Zitat:

Wie kann ich diese Variable bzw. die Datei dann als Image auf die Festplatte (oder alternativ in eine Image-Komponente) schreiben?

Delphi-Quellcode:
function DownloadURLToFile_NOCache(const FileURL, FileName: String): Cardinal;
var
  hSession, hFile: HInternet;
  Buffer: array[1..1024] of Byte;
  BufferLen, fSize: LongWord;
  f: File;
begin
  Result := 0;
  hSession := InternetOpen('MyApp', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if Assigned(hSession) then begin
    hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0, INTERNET_FLAG_RELOAD, 0);
    if Assigned(hFile) then
    begin
      AssignFile(f, FileName); // Kann auch durch einen Filestream ersetzt werden
      Rewrite(f,1);
      fSize := 0;
      repeat
        InternetReadFile(hFile, @Buffer, SizeOf(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen);
        fSize := fSize + BufferLen;
      until (BufferLen = 0);
      CloseFile(f);
      Result := fSize;
      InternetCloseHandle(hFile);
    end;
    InternetCloseHandle(hSession);
  end;
end;

marabu 3. Mär 2008 07:48

Re: Download ohne Cache?
 
Moin zusammen,

Zitat:

Zitat von Christian Seehase
... Das tut sie, meiner Erfahrung nach, leider nicht, weshalb ich in so einem Falle die Indys (TidHTTP) zu verwenden. ...

vielleicht sollten wir das Thema etwas vertiefen.

Die API Funktion UrlDownloadToFile() fordert ein Dokument grundsätzlich vom Server an. Will ich das nicht, dann muss ich UrlDownloadToCacheFile() verwenden. Dieses Verhalten sollte seit IE4 zu beobachten sein. Mir ist bewusst, dass es widersprüchliche Beiträge im Internet gibt. Ich habe deshalb meine Aussage mit einem lokalen HTTP-Server verifiziert.

UrlDownloadToFile() kann nicht verhindern, dass der Server mit dem Status-Code 304 (Not Modified) arbeitet, was dazu führt, dass ein eventuell im lokalen Cache vorhandenes Dokument angedient wird.

Ich würde den Fehler beim Standalone HTTP-Server der WebCam suchen und mir ansonsten so behelfen:

Delphi-Quellcode:
function Download(const url, fn: string; allowFromCache: Boolean = True): Boolean;
begin
  if not allowFromCache then
    DeleteUrlCacheEntry(PChar(url));
  Result := Succeeded(UrlDownloadToFile(nil, PChar(url), PChar(fn), 0, nil));
end;
Freundliche Grüße

PS: Die Referenz zu allen Windows API Funktionen ist natürlich der Windows SDK (vormals Windows Platform SDK) - auch Online.

Christian Seehase 3. Mär 2008 07:57

Re: Download ohne Cache?
 
Moin Marabu,

das war, wie gesagt, ein Erfahrungswert, dass UrlDownloadToFile den Cache benutzt.
Da das damals, in der fraglichen Anwendung, recht störend war, habe ich das nicht weiter vertieft, und bin auf TidHTTP ausgewichen ;-)

[EDIT]
Zumindest wird mit UrlDownloadToFile zuerst in den Cache geladen, und dann an den gewünschten Speicherort kopiert, so wie man es auch bei einem Download im IE immer wieder beobachten kann, denn ich konnte die Dateien immer im Cache wiederfinden, auch wenn ich nur über die Funktion auf diese zugegriffen hatte.
Für meinen Geschmack, auch kein schönes Verhalten. ;-)
[/EDIT]

himitsu 3. Mär 2008 09:40

Re: Download ohne Cache?
 
wenn es unbedingt MSDN-Library durchsuchenUrlDownloadToFile sein muß:

http://www.delphipraxis.net/internal...ct.php?t=68762


ja, hatte och mal das Problem :?


[add]mir ist aber aufgefallen, daß man durch änderung der URL auch an neue Dateien rankommt.

http://192.168.0.20/IMAGE.JPG?irgenwas
(z.B. irgendwas = aktuelle Zeit)

hatte auf 'nem Rechner mal Probleme mit der Chache und die DP-Seiten wurden nicht aktualisiert ... einfach 'ne fortaufende Zahl anzuhängen half da jedenfalls :stupid:

mohikaner13 3. Mär 2008 14:53

Re: Download ohne Cache?
 
Hallo - Holla !

Da ist man kaum mal 'n paar Stunden auf der Arbeit und heimlich still und leise kriegt man hier in DP alle Probleme gelöst.

Aber der Reihe nach:

Den Workaround von himitsu mit dem Anhängen einer veränderlichen z.B. Zahl an die URL habe ich gleich als erstes ausprobiert - das geht ja sehr fix - und es funktioniert prima. Das muss ich mir merken, wenn's mal wieder schnell gehen soll. Da ich mir aber nicht sicher bin, ob ich dadurch nicht evtl. später mal zwischengeschaltete Proxy oder Cache "vollmülle" habe ich das 'nur' als "Workaround" in meinen Tipps und Tricks gespeichert, aber im vorliegenden Fall nicht angewandt.

Der Code von toms arbeitet genau so, wie ich das will. Immer die wirklich aktuelle Datei vom Server. Danke dafür.

Und dank der tollen Beschreibung von marabu weis ich jetzt auch wie das ganze zusammenhängt und warum das ganze so arbeitet. Da der Code von toms gut arbeitet und ich an den HTTP-Server der Webcam nicht ohne Verrenkungen drankomme, verkneife ich mir es, jedesmal den Cache zu löschen. Trotzdem danke für den Hinweis.

Ebenso Danke an alle anderen an der Diskussion beteiligten, durch die Diskussion kann ich (als Gelegenheitsprogrammierer) immer nur lernen. So vergesse ich z.B. immer wieder, dass die meisten Funktionen der Windows-API angehören und daher im SDK beschrieben sind. Danke auch für diesen Hinweis!

Jetzt kann ich mich endlich dran machen, die Bilder der Webcam auomatisch zu speichern und evtl. schaffe ichs auch irgendwann mal, die Aufzeichnung so auszuwerten, dass ich bei einer Bewegung im Bild die Aufzeichnungsfrequenz erhöhen kann (von z.B. ein Bild alle 5 Minuten zu ein Bild alle 2 Sekunden) - aber das ist eine andere Geschichte.

Einen schönen Tag wünsche ich noch.

Und danke noch mal für Kompetenz und Reaktionszeit (in diesem Fall Problemlösung in < 24 H - Hut ab !!)

mohikaner13 3. Mär 2008 15:07

Re: Download ohne Cache?
 
Da fällt mir gerade noch eine Frage ein - aber dafür bitte nicht erschlagen!

marabu hat in Beitrag #10 erwähnt

Zitat:

Die API Funktion UrlDownloadToFile() ....
woran erkenne ich, dass eine Funktion eine API-Funktion ist und ich daher bei Problemen im SDK nachsehen muss. Wenn ich das richtig verstanden habe, dann sind die "normalen" - will sagen integrierten - Delphi-Funktionen doch Bestandteil der VCL und daher auch in der Delphi - Hilfe beschrieben.

Mir passiert das nämlich öfter, dass ich im Internet einen Code-Schnipsel finde, bei dem ich an irgendeinem Befehl hängen bleibt (will sagen, den Befehl kenne oder verstehe ich nicht) und dann in der Delphi-Hilfe nichts dazu finde.

Klar, wenn die Funktion von einer externen Komponente kommt, dann muss ich halt dort nach Hilfe suchen (Autor oder Datei oder...).

Gibt es da noch mehr Fälle außer (Aber ich glaub jetzt wird's zu sehr Off-Topic):

VCL
externe Komponente
Windows-API ???



Gruß,

marabu 3. Mär 2008 15:47

Re: Download ohne Cache?
 
Hallo Jörg,

mit zunehmender Erfahrung wirst du an einem Code-Schnippsel erkennen, ob eine Funktion aus der VCL stammt oder nicht. Den Rest kannst du im D5 Win32 SDK suchen oder in der MSDN Library. Einige API Funktionen zeichnen sich durch eine spezielle Namenskonvention aus, so dass man sie leicht als API Funktion erkennen kann. Findest du einen Hinweis auf eine fremde Komponente, dann hilft oft die Suche im Internet weiter. Ich versuche bei meinen Code-Beispielen immer die relevanten Units anzugeben, viele andere tun das auch. Und wenn alle Stricke reißen, dann kannst du immernoch hier fragen.

Freundliche Grüße

mohikaner13 3. Mär 2008 18:41

Re: Download ohne Cache?
 
So ähnlich hatte ich mir das gedacht.

Danke nochmals.

Gruß,


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz