Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 Uhr.
Seite 1 von 2  1 2      

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