2008-11-26 8 views
25

Ich weiß, dass es viele Möglichkeiten gibt, Bild-Caching zu verhindern (z. B. über META-Tags), sowie ein paar nette Tricks, um sicherzustellen, dass die aktuelle Version eines Bildes mit jeder Seite angezeigt wird laden (wie image.jpg? x = timestamp), aber gibt es eine Möglichkeit, ein Bild im Cache des Browsers zu löschen oder zu ersetzen, sodass keine der oben genannten Methoden erforderlich ist?So löschen oder ersetzen Sie ein zwischengespeichertes Bild

Als Beispiel, sagen wir, es gibt 100 Bilder auf einer Seite und diese Bilder heißen "01.jpg", "02.jpg", "03.jpg" usw. Wenn Bild "42.jpg" ist ersetzt, gibt es eine Möglichkeit, es im Cache zu ersetzen, so dass "42.jpg" automatisch das neue Bild bei aufeinander folgenden Seiten lädt anzeigen? Ich kann die META-Tag-Methode nicht verwenden, weil ich brauche, dass ISN "T ersetzt, um im Cache zu bleiben, und ich kann die Zeitstempelmethode nicht verwenden, da ich nicht will, dass ALLE Bilder jedes Mal neu geladen werden Lasten.

ich habe mein Gehirn und abgekocht das Internet nach einer Möglichkeit, zerbrechen diese (vorzugsweise über Javascript), aber kein Glück. Irgendwelche Vorschläge zu tun?

Antwort

1

der Grund für den? x = Zeitstempel Trick verwendet wird, ist Das ist die einzige Möglichkeit, dies auf einer Bildbasis zu tun.Das oder dynamisch generieren Bildnamen und zeigen auf eine Anwendung, die das Bild ausgibt.

Ich schlage vor, Sie herauszufinden, Server-Seite, wenn das Bild geändert wurde/aktualisiert, und wenn ja, dann raus Setzen Sie Ihr Tag mit dem "x = timestamp" -Trick, um das neue Bild zu erzwingen.

40

Wenn Sie die Seite dynamisch schreiben, können Sie die letzten Änderung Zeitstempel an die URL anfügen:

<img src="image.jpg?lastmod=12345678" ...

+0

das ist die beste Antwort, die ich fühle, weil es immer noch erlaubt, den Browser zu cachen. –

+0

Wie wäre es '

11

<meta> absolut irrelevant ist. In der Tat sollten Sie nicht versuchen, es überhaupt zum Steuern des Caches zu verwenden (zu dem Zeitpunkt, an dem Inhalt des Dokuments gelesen wird, ist es bereits zwischengespeichert).

In HTTP ist jede URL unabhängig. Was auch immer Sie mit dem HTML-Dokument tun, es wird nicht auf Bilder angewendet.

Um das Zwischenspeichern zu steuern, können Sie die URLs jedes Mal ändern, wenn sich deren Inhalt ändert. Wenn Sie Bilder von Zeit zu Zeit aktualisieren, lassen Sie sie für immer zwischengespeichert werden und verwenden Sie einen neuen Dateinamen (mit einer Version, einem Hash oder einem Datum) für das neue Bild - dies ist die beste Lösung für langlebige Dateien.

Wenn Ihr Bild ändert sich sehr oft (alle paar Minuten oder sogar auf jede Anfrage), dann Cache-control: no-cache oder Cache-control: max-age= senden xx wo xx ist die Anzahl der Sekunden, die Bild „frisch“ ist.

Random URL für kurzlebige Dateien ist eine schlechte Idee. Es verschmutzt Caches mit nutzlosen Dateien und zwingt nützliche Dateien früher gelöscht werden. Wenn Sie Apache und mod_headers oder mod_expires haben, erstellen Sie die Datei .htaccess mit den entsprechenden Regeln.

<Files ~ "-nocache\.jpg"> 
    Header set Cache-control "no-cache" 
</Files> 

Above machen *-nocache.jpg Dateien nicht cachespeicherbare.

Sie auch Bilder über PHP-Skript dienen könnte (sie haben schreckliche cachability standardmäßig;)

0

Ändern der ETAG für das Bild.

+1

Es hilft nicht, wenn Browser nicht gecached Bild zu validieren. – Kornel

+0

mit Browser-Caching, gibt es nie eine einzige Lösung für alle. Dies ist nur eine, um die hinzuzufügen Ich habe nur ein paar Vorschläge gemacht. " – StingyJack

4

Ich bin sicher, dass die meisten Browser den Last-Modified HTTP-Header respektieren. Schicke diese heraus und fordere ein neues Bild an. Es wird vom Browser zwischengespeichert, wenn sich die zuletzt geänderte Zeile nicht ändert.

0

Falls ein Bild erneut hochgeladen wird, gibt es eine Möglichkeit, die zuvor zwischengespeicherte Bildclientseite zu löschen oder zu ERSETZEN? In meinem obigen Beispiel ist das Ziel, den Browser zu vergessen, was "42.jpg" ist

Sie laufen Firefox richtig?

  • Finden Sie die Tools Menü
  • Select Clear Private Data
  • entmarkieren alle Kontrollkästchen mit Ausnahme stellen Sie sicher, Cache
  • Presse OK

:-)

In allen Ernstes überprüft wird, Ich habe noch nie davon gehört, dass so etwas existiert, und ich bezweifle es dort s eine API dafür. Ich kann mir nicht vorstellen, dass es eine gute Idee von Seiten der Browser-Entwickler wäre, dich in ihrem Cache herumstochern zu lassen, und es gibt keine Motivation, dass ich jemals sehen kann, dass sie solch ein Feature implementieren.

Ich kann nicht die META-Tag-Methode ODER die Timestamp-Methode verwenden, weil ich möchte, dass alle Bilder unter normalen Umständen zwischengespeichert werden.

Warum können Sie nicht einen Zeitstempel (oder etag, was auf das gleiche Verhältnis) verwenden? Denken Sie daran, dass Sie den Zeitstempel der Bilddatei selbst verwenden sollten, nicht nur Time.Now.
Ich hasse es, der Überbringer schlechter Nachrichten zu sein, aber Sie haben keine anderen Möglichkeiten.

Wenn sich die Bilder nicht ändern, wird auch der Zeitstempel nicht angezeigt, also wird alles "unter normalen Umständen" zwischengespeichert. Wenn sich die Bilder ändern, erhalten sie einen neuen Zeitstempel (den sie zum Zwischenspeichern benötigen), aber dieser Zeitstempel bleibt für immer gültig, bis jemand das Bild erneut ersetzt.

0

Nein, es gibt keine Möglichkeit, eine Datei in einem Browser-Cache zu löschen, entweder vom Webserver oder von irgendetwas, das Sie in die gesendeten Dateien einfügen können. Der Browser-Cache gehört dem Browser und wird vom Benutzer gesteuert.

Daher sollten Sie jede Datei und jede URL als eine wertvolle Ressource behandeln, die sorgfältig verwaltet werden sollte.

Daher scheint der Vorschlag von porneL, die Bilddateien zu versionieren, die beste langfristige Antwort zu sein. Die ETAG wird unter normalen Umständen verwendet, aber vielleicht haben Ihre Bemühungen dies zunichte gemacht? Versuchen Sie, die ETAG wie vorgeschlagen zu ändern.

0

Wenn das Ändern des Bilddateinamens keine Option ist, dann verwenden Sie eine serverseitige Sitzungsvariable und eine Javascript window.location.reload() Funktion.Wie folgt:

Nach Upload abgeschlossen:

Session("reload") = "yes" 

Auf page_load:

If Session("reload") = "yes" Then 
    Session("reload") = Nothing 
    ClientScript.RegisterStartupScript(Me.GetType), "ReloadImages", "window.location.reload();", True) 
End If 

Dies ist der Client-Browser nur einmal aktualisiert werden kann, weil die Sitzungsvariable nach einem Auftreten zurückgesetzt .

Hoffe, das hilft.

1

Siehe http://en.wikipedia.org/wiki/URI_scheme

Beachten Sie, dass Sie einen eindeutigen Benutzernamen zur Verfügung stellen kann: Passwort @ Combo als Präfix für den Domänenteil des uri. Bei meinen Experimenten habe ich festgestellt, dass die Einfügung einer falschen ID (oder eines Passworts, das ich annehme) dazu führt, dass die Ressource als einzigartig behandelt wird, wodurch die Zwischenspeicherung nach Wunsch unterbrochen wird.

Verwenden Sie einfach einen Zeitstempel als Benutzername und soweit ich sagen kann ignoriert der Server diesen Teil des uri, solange die Authentifizierung nicht eingeschaltet ist.

Btw - Ich konnte auch nicht die oben genannten Tricks mit einem Google Map Markersymbol Caching-Problem Ich hatte, wo der? Param = Zeitstempel Trick gearbeitet, aber Probleme mit verschwinden Overlays verursacht. Konnte nie herausfinden, warum das so war, aber so weit, so gut mit dieser Methode. Was mir unsicher ist, ist, ob die Weitergabe von gefälschten Anmeldeinformationen irgendwelche ungünstigen Serverleistungen haben wird. Wenn jemand weiß, würde mich das interessieren, denn ich bin noch nicht in Massenproduktion.

Bitte melden Sie Ihre Ergebnisse zurück.

9

Fügen Sie die URL Bild wie dieses

"image1.jpg?" + DateTime.Now.ToString ("ddMMyyyyhmhmstst");

Fügen Sie einfach zufällige Zeichenfolge im Abfragezeichenfolgeflag

Danke

Raju Jetla

+2

Dies aktualisiert den Bild-Cache nicht wirklich. Er trickst den Browser einfach dazu, ein neues Bild zu denken. Wenn ich den Chrom-Cache überprüfe, kann ich 12+ des gleichen Bildes sehen. Cache-Control einstellen auf dem Server Antwort auf mich ist eine bessere Lösung, weniger von einem Hack. Idealerweise möchten Sie den Browser das Bild zwischenspeichern, nur bei Änderung aktualisieren. – Lex

0

Cache ersetzen für pictore Sie auf serverseitige einige Versionswert speichern kann, und wenn Sie Bild laden nur senden dieser Wert stattdessen Zeitstempel. Wenn dein Bild geändert wird, ändere seine Version.

6

Im Gegensatz zu dem, was einige der anderen Antworten gesagt haben, gibt IS eine Möglichkeit für Client-Side-JavaScript, ein zwischengespeichertes Bild zu ersetzen. Der Trick besteht darin, ein verstecktes zu erstellen, sein Attribut src auf die Image-URL zu setzen, zu warten, bis es geladen wird, und dann zwangsweise neu zu laden, indem location.reload(true) aufgerufen wird. Dadurch wird die zwischengespeicherte Kopie des Bildes aktualisiert. Sie können dann die Elemente auf Ihrer Seite ersetzen (oder Ihre Seite neu laden), um die aktualisierte Version des Bildes zu sehen.

(Kleiner Vorbehalt: wenn einzelne Elemente aktualisiert werden, und wenn es mehr als eins mit dem Image gibt, das aktualisiert wurde, müssen Sie ALL löschen oder entfernen und dann ersetzen oder zurücksetzen. Wenn Sie es tun eins nach dem anderen kopieren einige Browser die In-Memory-Version des Images von anderen Tags, und das Ergebnis ist, dass Sie das aktualisierte Image möglicherweise nicht sehen, obwohl es sich im Cache befindet.

Ich postete einen Code, um diese Art von Update here zu tun.

-1

Ich habe versucht, etwas lächerlich einfach:

Zum FTP-Ordner der Website und benennen Sie die IMG-Ordner IMG2. Aktualisieren Sie Ihre Website und Sie werden sehen, dass die Bilder fehlen werden. Dann benenne den Ordner IMG2 wieder in IMG um und es ist fertig, zumindest funktionierte es für mich in Safari.

+0

Dies würde nur den Cache der Clients aktualisieren, die auf die Seite zugegriffen haben, wenn die Das Bild wurde verschoben und 404. Das OP war wahrscheinlich auf der Suche nach etwas, das unabhängig vom Zeitpunkt an alle Benutzer kaskadieren würde. – Compass

2

Sie können eine Zufallszahl an das Bild anhängen, die an eine neue Version erinnert. Ich habe die ähnliche Logik implementiert und es funktioniert perfekt.

<script> 
var num = Math.random(); 
var imgSrc= "image.png?v="+num; 
$(function() { 
$('#imgID').attr("src", imgSrc); 
}) 
</script> 
0

diesen Code-Schnipsel Versuchen:

var url = imgUrl? + Math.random(); 

Dies wird sicherstellen, dass jede Anforderung eindeutig zuzuordnen ist, so dass Sie das neueste Bild immer erhalten.

0

ich in der Regel die gleiche wie @ Greg sagte uns, und ich habe eine Funktion dafür:

function addMagicRefresh(url) 
{ 
    var symbol = url.indexOf('?') == -1 ? '?' : '&'; 
    var magic = Math.random()*999999; 
    return url + symbol + 'magic=' + magic; 
} 

Dies funktioniert, da der Server es akzeptiert und Sie verwenden nicht die „Magie“ Parameter beliebige andere Weise.

Ich hoffe es hilft.

+0

Magie? Das ist so Amateur Ansatz, dass es jedes Mal neu geladen wird. Etwas wie das Hinzufügen des heutigen Zeitstempels ist eine viel bessere Lösung. – user3304007

+1

@ user3304007 das ist genau mein Ziel mit dem Code oben. Da mein Benutzer ein Bild und meine Bild-URL ersetzt, ist immer die gleiche URL. Wenn Sie einen Zeitstempel verwenden, wird mein Bild nicht aktualisiert. Also, es ist nicht Amateur, es ist von Design. –