AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Download ohne Cache?
Thema durchsuchen
Ansicht
Themen-Optionen

Download ohne Cache?

Ein Thema von mohikaner13 · begonnen am 2. Mär 2008 · letzter Beitrag vom 3. Mär 2008
Antwort Antwort
Seite 1 von 2  1 2      
mohikaner13

Registriert seit: 2. Mär 2008
Ort: Sankt Ingbert
10 Beiträge
 
Delphi 5 Standard
 
#1

Download ohne Cache?

  Alt 2. Mär 2008, 19:01
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.
--
Jörg Hemmerling
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Download ohne Cache?

  Alt 2. Mär 2008, 19:52
Lösch doch einfach das Bild im Cache.
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
mohikaner13

Registriert seit: 2. Mär 2008
Ort: Sankt Ingbert
10 Beiträge
 
Delphi 5 Standard
 
#3

Re: Download ohne Cache?

  Alt 2. Mär 2008, 20:15
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?
--
Jörg Hemmerling
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Download ohne Cache?

  Alt 2. Mär 2008, 20:20
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
  Mit Zitat antworten Zitat
fLaSh11
(Gast)

n/a Beiträge
 
#5

Re: Download ohne Cache?

  Alt 2. Mär 2008, 20:22
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 von mohikaner13:
{...} + '\akBild.jpg') {...}
  Mit Zitat antworten Zitat
mohikaner13

Registriert seit: 2. Mär 2008
Ort: Sankt Ingbert
10 Beiträge
 
Delphi 5 Standard
 
#6

Re: Download ohne Cache?

  Alt 2. Mär 2008, 20:44
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?
--
Jörg Hemmerling
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Download ohne Cache?

  Alt 2. Mär 2008, 21:45
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 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 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
mohikaner13

Registriert seit: 2. Mär 2008
Ort: Sankt Ingbert
10 Beiträge
 
Delphi 5 Standard
 
#8

Re: Download ohne Cache?

  Alt 2. Mär 2008, 21:58
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;
--
Jörg Hemmerling
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#9

Re: Download ohne Cache?

  Alt 3. Mär 2008, 05:49
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;
Thomas
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Download ohne Cache?

  Alt 3. Mär 2008, 07:48
Moin zusammen,

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.
  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 06:07 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