Prüfen, ob jpg image schon vorhanden ist, bevor es geladen wird

  • Themenstarter Themenstarter hüteüberhüte
  • Beginndatum Beginndatum
H

hüteüberhüte

Gast
Hallo, ich möchte prüfen, ob ein Image schon auf der Platte vorhanden ist. Wie mache ich das am Besten? Dateiname, Länge oder Hash überprüfen?
 
Reicht [japi]File#exists()[/japi] denn nicht aus? Oder habe ich die Frage falsch verstanden?
 
Zuletzt bearbeitet:
Das Image stammt von einem Webserver und es kann sich ändern, das ist das Problem...
 
Gut wärs, wenn sich vor dem Laden entscheiden ließe, ob ein aktuelleres Image geladen werden muss

[OT]Keinen OT philosophie Thread starten, bitte[/OT]
 
Ich weiss ja nicht, wie du die Datei speicherst, aber per FileIO sollte sich eine Prüfsumme beliebiger Bitbreite wie folgt erstellen lassen.
Java:
FileOutputStream fOut = new FileOutputStream((File) f, false);
InputStream in = url.openStream();
int r;
long sum = 0;
while((r = in.read()) != -1) {
	fOut.write(r);
	sum += r;
}
in.close();
fOut.close();
Vor dem Laden kannst du evtl. serverseitig per Http-Responsecode (401, 500 usw.) steuern. Da gibt es einen, ich meine das war 200, der den Clienten anweist (besser gesagt vorschlägt) die Datei aus dem Cache zu verwenden.
 
Zuletzt bearbeitet von einem Moderator:
Habe mal eben ein wenig gegoogelt da ich mich mit Images selber kaum auskenne, vielleicht hilft dir folgende Seite weiter (es werden zwei Methoden zum vergleichen vorgestellt): Klick
 
Gut wärs, wenn sich vor dem Laden entscheiden ließe, ob ein aktuelleres Image geladen werden muss
Dann schicke dem Server einen HEAD-Request und überlege dir, wie du basierend auf diesen Infos weiter verfährst, soll heißen GET hinterher oder von Platte holen.
Wenn du nicht weißt, was das für infos sind, dann schau mal hier rein: Wikipedia

[OT][OT]Keinen OT philosophie Thread starten, bitte[/OT]
Philosophie? Nein. Eher eine Analogie was den Informationsfluss angeht. Aber zumindest kann man mittlerweile erraten, dass du hier so eine Art Browsercache nachbauen willst.
[/OT]
 
Zuletzt bearbeitet von einem Moderator:
Ja, so etwas ähnliches wie ein Br. Cache.

Lässt sich mit new URL(urlStr) etwas anfangen, oder muss ich absolut low-level ansetzen?

Grüße!

Gesendet mit Tapatalk 2
 
Du musst einen HTTP-Request absetzen und die Response auswerten z.B. mittels einer [JAPI]HttpURLConnection[/JAPI], welche du (Danke an Spacerat für den Hinweis) mit [JAPI]URL#openConnection()[/JAPI] erhältst.

Oder du nimmst 3rd-Party-Libs wie die Apache HttpComponents

Und weiter runter als HTTP musst du eigentlich nicht. Also keine Angst, zu "absolut low-level" wirst du nicht verdonnert 🙂
 
Zuletzt bearbeitet von einem Moderator:
Also mit URLs lässt sich schon gewaltig etwas anfangen. Nur solltest du nicht die Abkürzung "url.openStream()", sondern "url.openConnection()" verwenden, über welche du dann neben dem Stream noch andere Attribute bekommst. Für das Web dürfte dich dabei HTTPURLConnection interessieren.
 
@TO
du müsstest eine server-sprache einsetzen die dir auf die selbe weise einen hash berechnet wie die methode mit der du den hash des files bekommst ...

am einfachsten wäre hier wohl MD5 ... besser allerdings natürlich SHA-2 familie ...

du berechnest einfach den hash des files und fragst beim server nach dem aktuellen ...
sind beide identisch > platten cache ...
wenn unterschiedlich > neu vom server laden ...
 
Dein Freund hierzu heisst ".getLastModified()" der HttpURLConnection sowie .getLastModified/.setLastModified von java.io.File

Vorgehensweise:

1) .getLastModified() des Bilds vom Server holen

2) Wenn Bild nicht auf Platte vorhanden, herunterladen und via File#setLastModified(long) das Dateidatum auf das Datum vom Server setzen

3) Wenn Bild vorhanden, dann prüfen ob das Bild auf der Platte (File#getLastModified()) ein anderes Datum zu HttpURLConnection#getLastModified()) hat. Wenn ja, Bild neu runterladen und Dateidatum setzen.

Alternativ kann man mal mit ifModifiedSince von HttpURLConnection herumspielen wenn man einfach ein GET absetzen will.

Bernd
 

Zurück
Oben