![]() |
Download ohne Cache?
Hallo,
ich habe ein Problem beim runterladen einer JPG-Grafik von einer Webcam. Mit dem Code
Delphi-Quellcode:
bekomme ich ohne Probleme die aktuelle Ansicht der Webcam runtergeladen.
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; 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. |
Re: Download ohne Cache?
Lösch doch einfach das Bild im Cache.
|
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? |
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 |
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:
|
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:
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).
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; 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? |
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:
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:
|
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 ![]() 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; |
Re: Download ohne Cache?
Zitat:
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; |
Re: Download ohne Cache?
Moin zusammen,
Zitat:
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:
Freundliche Grüße
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; PS: Die Referenz zu allen Windows API Funktionen ist natürlich der Windows SDK (vormals Windows Platform SDK) - auch ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:12 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