2008-11-26 18 views
25

So che ci sono molti modi per prevenire il caching delle immagini (come tramite i tag META), così come alcuni trucchi per assicurarsi che la versione corrente di un'immagine sia mostrata con ogni pagina carica (come image.jpg? x = timestamp), ma esiste un modo per cancellare o sostituire un'immagine nella cache del browser in modo che nessuno dei due metodi sopra siano necessario?come cancellare o sostituire un'immagine memorizzata nella cache

Ad esempio, diciamo che ci sono 100 immagini su una pagina e che queste immagini sono denominate "01.jpg", "02.jpg", "03.jpg", ecc. Se l'immagine "42.jpg" viene sostituito, esiste un modo per sostituirlo nella cache in modo che "42.jpg" visualizzi automaticamente la nuova immagine nei successivi caricamenti di pagina? Non posso usare il metodo del tag META, perché ho bisogno di everuthing che ISN "T rimpiazzato per rimanere in cache, e non posso usare il metodo timestamp, perché non voglio TUTTE le immagini da ricaricare ogni volta che la pagina carichi.

ho travasato il mio cervello e perlustrato Internet per un modo per farlo (preferibilmente tramite JavaScript), ma senza fortuna. Qualche suggerimento?

risposta

1

il motivo del? x = timestamp trucco è usato è perché è l'unico modo per farlo in base all'immagine, oppure generare dinamicamente nomi di immagini e puntare a un'applicazione che restituisce l'immagine

Ti suggerisco di capire, lato server, se l'immagine è stata cambiata/aggiornato, e in caso affermativo metti il ​​tuo tag con il trucco? x = timestamp per forzare la nuova immagine.

40

Se si scrive nella pagina in modo dinamico, è possibile aggiungere l'ultima modifica timestamp all'URL:

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

+0

questa è la risposta migliore che ritengo perché consente comunque al browser di memorizzare nella cache. –

+0

come dire '

11

<meta> è assolutamente irrilevante. In effetti, non dovresti provare a usarlo per controllare la cache (nel momento in cui qualcosa legge il contenuto del documento, è già memorizzato nella cache).

In HTTP ogni URL è indipendente. Qualunque cosa tu faccia al documento HTML, non si applicherà alle immagini.

Per controllare la memorizzazione nella cache è possibile modificare gli URL ogni volta che il contenuto cambia. Se aggiorni le immagini di volta in volta, consenti loro di rimanere nella cache per sempre e usa un nuovo nome file (con una versione, un hash o una data) per la nuova immagine: è la soluzione migliore per i file di lunga durata.

Se le modifiche di immagini molto spesso (ogni pochi minuti, o addirittura su ogni richiesta), quindi inviare Cache-control: no-cache o Cache-control: max-age=xx dove xx è il numero di secondi che l'immagine è "fresco".

L'URL casuale per file di breve durata è una cattiva idea. Interagisce le cache con file inutili e costringe i file utili a essere eliminati prima.

Se si dispone di Apache e mod_headers o mod_expires, creare il file .htaccess con le regole appropriate.

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

Sopra farà *-nocache.jpg file non-cacheable.

Si potrebbe anche servire immagini tramite script PHP (hanno cachability terribile per default;)

0

Modificare l'ETAG per l'immagine.

+1

Non sarà di aiuto se il browser non convalida l'immagine nella cache. – Kornel

+0

con la memorizzazione nella cache del browser, non c'è mai una soluzione unica per tutti, questo è solo uno da aggiungere al pochi suggerimenti suggeriti – StingyJack

4

sono sicuro che la maggior parte dei browser rispettano l'intestazione Last-Modified HTTP. Invia quelli fuori e richiedere una nuova immagine. Sarà memorizzato nella cache dal browser se la riga Last-Modified non cambia.

0

Nel caso in cui un'immagine venga caricata di nuovo, esiste un modo per CANCELLARE o SOSTITUIRE l'immagine lato client precedentemente memorizzata nella cache? Nel mio esempio sopra, l'obiettivo è quello di fare in modo che il browser dimentichi che "42.jpg" è

Stai eseguendo firefox giusto?

  • trovare il menu Tools
  • Selezionare Clear Private Data
  • Deselezionare tutte le caselle di controllo ad eccezione di assicurarsi Cache è selezionata
  • Premere OK

:-)

In tutta serietà, Non ho mai sentito di una cosa del genere esistente, e dubito che ci sia s un'API per questo. Non riesco a immaginare che sarebbe una buona idea per parte degli sviluppatori di browser lasciarti andare a curiosare nella loro cache, e non c'è alcuna motivazione che possa vedere per loro implementare mai una simile funzione.

NON POSSO utilizzare il metodo di tag META O il metodo di timestamp, perché voglio tutte le immagini memorizzate nella cache in circostanze normali.

Perché non è possibile utilizzare un timestamp (o etag, che equivale alla stessa cosa)? Ricorda che dovresti utilizzare il timestamp del file immagine stesso, non solo Time.Now.
Odio essere il portatore di cattive notizie, ma non hai altre opzioni.

Se le immagini non cambiano, né sarà il timestamp, quindi tutto verrà memorizzata nella cache "in circostanze normali". Se le immagini cambiano, riceveranno un nuovo timestamp (di cui avranno bisogno per motivi di memorizzazione nella cache), ma quel timestamp rimarrà valido per sempre finché qualcuno non sostituirà nuovamente l'immagine.

0

No, non c'è alcun modo per imporre un file in una cache del browser da eliminare, sia dal server web o da qualsiasi cosa che si può mettere nei file che invia. La cache del browser è di proprietà del browser e controllata dall'utente.

Quindi, si dovrebbe trattare ogni file e ogni URL come una risorsa preziosa che deve essere gestito con attenzione.

Pertanto, il suggerimento di porneL di versioning dei file di immagine sembra essere la migliore risposta a lungo termine. L'ETAG è usato in circostanze normali, ma forse i tuoi sforzi l'hanno annullato? Prova a cambiare l'ETAG, come suggerito.

0

Quando si cambia il nome del file immagine non è un'opzione quindi utilizzare una variabile di sessione lato server e una funzione JavaScript window.location.reload().Come segue:

dopo il caricamento completo:

Session("reload") = "yes" 

On Page Load:

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

Questo permette al browser client per aggiornare solo una volta perché la variabile di sessione viene ripristinato dopo un avvenimento .

Spero che questo aiuti.

1

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

Si noti che è possibile fornire un nome utente univoco: password @ combo come prefisso alla parte dominio dell'URI. Nella mia sperimentazione, ho trovato che l'inclusione di questo con una falsa carta d'identità (o la password presumo) risultati nel trattamento della risorsa come unica - rompendo così il caching come volete.

Basta usare un timestamp come nome utente e, per quanto posso dire, il server ignora questa parte dell'uri finché l'autenticazione non viene attivata.

Btw - Ho anche non poteva usare i trucchi di cui sopra con un pennarello google map problema icona caching stavo avendo in cui il trucco param = timestamp ha funzionato, ma ha causato problemi con le sovrapposizioni scompaiono?. Non sono mai riuscito a capire perché questo stava accadendo, ma finora è stato così bello usare questo metodo. Ciò di cui sono incerto, è che se le credenziali false passate avranno effetti negativi sulle prestazioni del server. Se qualcuno sa che sarei interessato a sapere come io non sono ancora in produzione ad alto volume.

Si prega di segnalare i risultati.

9

aggiungere l'URL dell'immagine come questo

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

Basta aggiungere stringa casuale nel querystring

Thank You

Raju Jetla

+2

Questo non aggiorna la cache di immagini, ma inganna il browser a pensare che sia una nuova immagine: con questo metodo, se controllo la cache di Chrome, posso vedere 12+ della stessa immagine. sulla risposta del server per me è una migliore soluzone, meno di un hack. Idealmente si vuole che il browser memorizzi l'immagine, basta aggiornarla sul cambiamento. – Lex

0

Per sostituire cache per pictore è possibile memorizzare sul lato server certo valore di versione e quando si caricano foto appena inviare questo valore invece timestamp. Quando la tua immagine sarà cambiata cambia la sua versione.

6

Contrariamente a quanto hanno detto alcune delle altre risposte, ci IS un modo per javascript sul lato client per sostituire un'immagine memorizzata nella cache. Il trucco consiste nel creare un elemento nascosto , impostare l'attributo src nell'URL dell'immagine, attendere che venga caricato, quindi ricaricarlo forzatamente chiamando location.reload(true). Questo aggiornerà la copia cache dell'immagine. È quindi possibile sostituire gli elementi <img> nella pagina (o ricaricare la pagina) per vedere la versione aggiornata dell'immagine.

(piccolo avvertimento: se si aggiornano i singoli elementi <img> e se ce ne sono più di quelli con l'immagine che è stata aggiornata, è necessario cancellarli o rimuoverli TUTTI e quindi sostituirli o ripristinarli. uno per uno, alcuni browser copiare la versione in memoria delle immagini da altri tag, e il risultato è che si potrebbe non vedere la vostra immagine aggiornata, nonostante il suo essere nella cache).

Ho inserito del codice per eseguire questo tipo di aggiornamento here.

-1

Ho provato qualcosa di ridicolmente semplice:

Vai alla cartella FTP del sito e rinominare la cartella IMG per IMG2. Aggiorna il tuo sito Web e vedrai che le immagini mancheranno. Quindi rinominare la cartella IMG2 su IMG e il gioco è fatto, almeno ha funzionato per me in Safari.

+0

Questo aggiornerebbe solo la cache di quei client che hanno avuto accesso alla pagina quando il l'immagine è stata spostata e 404. L'OP stava probabilmente cercando qualcosa che sarebbe caduto in cascata a tutti gli utenti indipendentemente dal punto di tempo – Compass

2

È possibile aggiungere un numero casuale all'immagine, che è come dargli una nuova versione. Ho implementato la logica simile e funziona perfettamente.

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

Prova questo frammento di codice:

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

Questo farà in modo che ogni richiesta è unico, così si otterrà l'ultima immagine sempre.

0

Io di solito fare lo stesso come @ Greg ci ha detto, e ho una funzione per questo:

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

questo funzionerà dal momento che il server accetta e non si utilizza il parametro "magia" qualsiasi altro modo.

Spero che aiuti.

+0

Magic? approccio più amatoriale che ogni volta sarà ricaricato. Fare qualcosa come aggiungere il timestamp di oggi sarà una soluzione molto migliore. – user3304007

+1

@ user3304007 questo è esattamente il mio obiettivo con il codice sopra. Poiché il mio utente sostituisce un'immagine e il mio URL dell'immagine è sempre lo SAME. L'uso di un timestamp non aggiornerà la mia immagine. Quindi, non è un dilettante, è designato. –

Problemi correlati