2008-11-26 19 views
25

मुझे पता है कि छवि कैशिंग (जैसे मेटा टैग के माध्यम से) को रोकने के कई तरीके हैं, साथ ही यह सुनिश्चित करने के लिए कुछ अच्छी चालें हैं कि छवि का वर्तमान संस्करण प्रत्येक पृष्ठ के साथ दिखाया गया है लोड (जैसे image.jpg? x = timestamp), लेकिन ब्राउज़र कैश में किसी छवि को वास्तव में स्पष्ट या प्रतिस्थापित करने का कोई तरीका है ताकि ऊपर दिए गए तरीकों में से कोई भी आवश्यक न हो?कैश किए गए चित्र को साफ़ या प्रतिस्थापित करने के लिए

उदाहरण के तौर पर, मान लें कि पृष्ठ पर 100 छवियां हैं और इन छवियों को "01.jpg", "02.jpg", "03.jpg", आदि नाम दिया गया है। यदि छवि "42.jpg" प्रतिस्थापित किया गया है, क्या इसे कैश में बदलने का कोई तरीका है ताकि "42.jpg" स्वचालित रूप से लगातार पेज लोड पर नई छवि प्रदर्शित कर सके? मैं मेटा टैग विधि का उपयोग नहीं कर सकता, क्योंकि मुझे कभी भी यह पता होना चाहिए कि आईएसएन "टी को कैश रहने के लिए प्रतिस्थापित किया गया है, और मैं टाइमस्टैम्प विधि का उपयोग नहीं कर सकता, क्योंकि मैं नहीं चाहता कि सभी छवियों को पृष्ठ पर हर बार फिर से लोड किया जाए लोड होता है।

मैं अपने दिमाग racked है और यह (अधिमानतः जावास्क्रिप्ट के माध्यम से) करने के लिए एक रास्ता है, लेकिन कोई भाग्य के लिए इंटरनेट में घूमते रहे। कोई सुझाव?

उत्तर

1

कारण? एक्स = टाइमस्टैम्प चाल इस्तेमाल किया जाता है क्योंकि यह प्रति छवि आधार पर ऐसा करने का एकमात्र तरीका है। वह छवि या छवियों को गतिशील रूप से उत्पन्न करता है जो छवि को आउटपुट करता है।

मेरा सुझाव है कि अगर आप छवि बदल दी गई हैं, तो सर्वर की तरफ से पता चलता है, अपडेट किया गया, और यदि ऐसा है तो बाहर नई छवि को मजबूर करने के लिए अपना टैग? x = timestamp चाल के साथ रखें।

40

आप गतिशील पेज लिख रहे हैं, तो आप यूआरएल के लिए अंतिम संशोधित टाइमस्टैम्प जोड़ सकते हैं:

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

+0

यह सबसे अच्छा जवाब है जो मुझे लगता है क्योंकि यह अभी भी ब्राउज़र को कैश करने की अनुमति देता है। –

+0

'

11

<meta> बिल्कुल अप्रासंगिक है। वास्तव में, आपको कैश को नियंत्रित करने के लिए इसका उपयोग करने की कोशिश नहीं करनी चाहिए (जब तक दस्तावेज़ की सामग्री को कुछ भी पढ़ा जाता है, यह पहले से ही कैश किया जाता है)।

HTTP में प्रत्येक यूआरएल स्वतंत्र है। आप जो भी HTML दस्तावेज़ में करते हैं, वह छवियों पर लागू नहीं होगा।

कैशिंग को नियंत्रित करने के लिए आप प्रत्येक बार उनकी सामग्री में बदलावों को बदल सकते हैं। यदि आप समय-समय पर छवियों को अपडेट करते हैं, तो उन्हें हमेशा के लिए कैश करने की अनुमति दें और नई छवि के लिए एक नया फ़ाइल नाम (संस्करण, हैश या डेट के साथ) का उपयोग करें - यह लंबे समय तक चलने वाली फ़ाइलों के लिए सबसे अच्छा समाधान है।

अपनी छवि में परिवर्तन बहुत बार (हर कुछ मिनट, या यहां तक ​​कि प्रत्येक अनुरोध पर), तो Cache-control: no-cache या Cache-control: max-age=xx जहां xx सेकंड की संख्या उस छवि "फ्रेश" है भेजें।

अल्पकालिक फ़ाइलों के लिए यादृच्छिक URL खराब विचार है। यह बेकार फाइलों के साथ कैश को प्रदूषित करता है और उपयोगी फ़ाइलों को जल्द ही शुद्ध करने के लिए मजबूर करता है।

यदि आपके पास अपाचे और mod_headers या mod_expires है तो उपयुक्त नियमों के साथ .htaccess फ़ाइल बनाएं।

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

ऊपर *-nocache.jpg फ़ाइलों को गैर-कैश करने योग्य बना देगा।

तुम भी PHP स्क्रिप्ट के माध्यम से छवियों सेवा कर सकता है (वे डिफ़ॉल्ट रूप से भयंकर cachability है;)

0

बदलें छवि के लिए ETag।

+1

ब्राउज़र ब्राउज़र कैशिंग के साथ – Kornel

+0

को सत्यापित नहीं करता है, यह एक-समाधान कभी भी फिट नहीं होता है। यह केवल एक ही है जो इसे जोड़ने के लिए है। आपके द्वारा सुझाए गए कुछ। – StingyJack

4

मुझे यकीन है कि अधिकांश ब्राउज़र Last-Modified HTTP शीर्षलेख का सम्मान करते हैं। उन्हें बाहर भेजें और एक नई छवि का अनुरोध करें। यदि अंतिम-संशोधित रेखा परिवर्तित नहीं होती है तो इसे ब्राउज़र द्वारा कैश किया जाएगा।

0

यदि कोई छवि फिर से अपलोड की जाती है, तो क्या पहले कैश किए गए छवि क्लाइंट-साइड को साफ़ या स्थानांतरित करने का कोई तरीका है? ऊपर दिए गए मेरे उदाहरण में, लक्ष्य ब्राउज़र को भूलना है कि "42.jpg"

आप फ़ायरफ़ॉक्स सही चला रहे हैं?

  • Tools मेनू
  • करें Clear Private Data
  • अचयनित करें सभी को छोड़कर बनाने के लिए चेक बॉक्स का पता लगाएं यकीन Cache चेक किया गया है
  • OK दबाएं

:-)

सभी गंभीरता में, मैंने कभी ऐसी चीज के बारे में कभी नहीं सुना है, और मुझे संदेह है कि मैं वहां हूं इसके लिए एक एपीआई है। मैं कल्पना नहीं कर सकता कि ब्राउज़र डेवलपर्स के हिस्से पर आपको एक अच्छा विचार होगा कि आप अपने कैश में चारों ओर घूमने दें, और ऐसी कोई प्रेरणा नहीं है जिसे मैं कभी भी ऐसी सुविधा को लागू करने के लिए देख सकूं।

मैं मेटा टैग विधि या टाइमस्टैम्प विधि का उपयोग नहीं कर सकता, क्योंकि मैं सामान्य परिस्थितियों में कैश की गई सभी छवियों को चाहता हूं।

आप टाइमस्टैम्प का उपयोग क्यों नहीं कर सकते (या एटैग, जो एक ही चीज़ के बराबर है)? याद रखें कि आपको छवि फ़ाइल के टाइमस्टैम्प का उपयोग करना चाहिए, न केवल Time.Now
मुझे बुरी खबरों के वाहक होने से नफरत है, लेकिन आपके पास कोई अन्य विकल्प नहीं है।

यदि छवियां नहीं बदलती हैं, न तो टाइमस्टैम्प होगा, इसलिए सब कुछ "सामान्य परिस्थितियों में" कैश किया जाएगा। अगर छवियां बदलती हैं, तो उन्हें एक नया टाइमस्टैम्प मिलेगा (जिसे उन्हें कैशिंग कारणों के लिए जरूरी है), लेकिन फिर उस टाइमस्टैम्प हमेशा के लिए वैध रहेगा जब तक कि कोई व्यक्ति फिर से छवि को प्रतिस्थापित नहीं करता।

0

नहीं, ब्राउज़र कैश में किसी फ़ाइल को हटाने के लिए कोई तरीका नहीं है, या तो वेब सर्वर द्वारा या जो कुछ भी आप भेज सकते हैं उसमें डाल सकते हैं। ब्राउज़र कैश ब्राउज़र के स्वामित्व में है, और उपयोगकर्ता द्वारा नियंत्रित है।

इसलिए, आपको प्रत्येक फ़ाइल और प्रत्येक यूआरएल को एक बहुमूल्य संसाधन के रूप में समझना चाहिए जिसे ध्यान से प्रबंधित किया जाना चाहिए।

इसलिए, छवि फ़ाइलों को संस्करणित करने के पॉर्नेल का सुझाव सबसे अच्छा दीर्घकालिक उत्तर प्रतीत होता है। सामान्य परिस्थितियों में ईएजी का उपयोग किया जाता है, लेकिन हो सकता है कि आपके प्रयासों ने इसे रद्द कर दिया हो? जैसा सुझाव दिया गया है, ETAG को बदलने का प्रयास करें।

0

छवि फ़ाइल नाम बदलने पर एक विकल्प नहीं है तो सर्वर साइड सत्र चर और जावास्क्रिप्ट window.location.reload() फ़ंक्शन का उपयोग करें।इस प्रकार है:

अपलोड पूर्ण करने के बाद:

Session("reload") = "yes" 

Page_Load पर:

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

इसका कारण यह है सत्र चर एक घटना के बाद रीसेट ग्राहक ब्राउज़र केवल एक बार ताज़ा करने के लिए अनुमति देता है ।

उम्मीद है कि इससे मदद मिलती है।

1

देखें http://en.wikipedia.org/wiki/URI_scheme

सूचना है कि आप एक अद्वितीय उपयोगकर्ता नाम प्रदान कर सकते हैं: uri के डोमेन भाग को एक उपसर्ग के रूप पासवर्ड @ कॉम्बो। मेरे प्रयोग में, मैंने पाया है कि इसे नकली आईडी (या पासवर्ड जो मैं मानता हूं) के साथ संसाधन के उपचार में अद्वितीय के रूप में शामिल करता है - इस प्रकार कैशिंग को तोड़ने की इच्छा होती है।

बस उपयोगकर्ता नाम के रूप में एक टाइमस्टैम्प का उपयोग करें और जहां तक ​​मैं कह सकता हूं कि सर्वर यूरी के इस हिस्से को अनदेखा करता है जब तक प्रमाणीकरण चालू नहीं होता है।

बीटीडब्ल्यू - मैं Google मानचित्र मार्कर आइकन कैशिंग समस्या के साथ उपरोक्त चाल का उपयोग नहीं कर सका, जहां मैं था? Param = timestamp चाल काम करता था, लेकिन गायब ओवरले के साथ समस्याएं उत्पन्न हुईं। यह क्यों नहीं हो सकता था कि यह क्यों हो रहा था, लेकिन इस विधि का उपयोग करके अब तक इतना अच्छा है। मुझे क्या पता नहीं है, अगर नकली क्रेडेंशियल पास करना होगा तो कोई प्रतिकूल सर्वर प्रदर्शन प्रभावित होगा। अगर कोई जानता है कि मुझे यह जानने में दिलचस्पी होगी क्योंकि मैं अभी तक उच्च मात्रा में उत्पादन में नहीं हूं।

कृपया अपने परिणामों की रिपोर्ट करें।

9

इस

की तरह छवि URL जोड़ें "image1.jpg?" + डेटटाइम.अब.ToString ("ddMMyyyyhhmmsstt");

बस क्वेरी स्ट्रिंग में यादृच्छिक स्ट्रिंग जोड़ें

आप

राजू Jetla

+2

यह वास्तव में छवि कैश को रीफ्रेश नहीं करता है। यह ब्राउज़र को अपनी नई छवि को सोचने में सक्षम बनाता है। इस विधि के साथ यदि मैं क्रोम कैश की जांच करता हूं तो मैं उसी छवि के 12+ देख सकता हूं। कैश-कंट्रोल सेट करना मेरे लिए सर्वर प्रतिक्रिया पर एक बेहतर soloution है, एक हैक से कम। आदर्श रूप से आप चाहते हैं कि ब्राउज़र छवि को कैश करे, बस इसे बदलने पर रीफ्रेश करें। – Lex

0

धन्यवाद pictore के लिए कैश आप सर्वर साइड पर स्टोर कर सकते हैं कुछ संस्करण मूल्य बदलने के लिए और जब आप चित्र लोड सिर्फ भेज इस मूल्य के बजाय टाइमस्टैम्प। जब आपकी छवि बदली जाएगी तो इसका संस्करण बदल जाएगा।

6

अन्य कुछ उत्तरों के विपरीत, आईएस कैश किए गए चित्र को प्रतिस्थापित करने के लिए क्लाइंट-साइड जावास्क्रिप्ट के लिए एक तरीका है। चाल एक छिपी हुई बनाने के लिए है, इसे src छवि URL पर विशेषता दें, इसे लोड करने के लिए प्रतीक्षा करें, फिर location.reload(true) पर कॉल करके जबरन इसे पुनः लोड करें। वह छवि की कैश की गई प्रति अपडेट करेगा। फिर आप छवि के अद्यतन संस्करण को देखने के लिए अपने पृष्ठ पर <img> तत्वों को प्रतिस्थापित कर सकते हैं (या अपने पृष्ठ को पुनः लोड कर सकते हैं)।

(छोटी चेतावनी: यदि व्यक्तिगत <img> तत्वों को अद्यतन करते हैं, और यदि अद्यतन की गई छवि से अधिक से अधिक हैं, तो आपको उन्हें साफ़ या निकालना होगा, और फिर उन्हें बदलें या रीसेट करें। अगर आप इसे करते हैं एक-एक करके, कुछ ब्राउज़र छवि के इन-मेमोरी संस्करण को अन्य टैग से कॉपी करेंगे, और नतीजा यह है कि कैश में होने के बावजूद आप अपनी अपडेट की गई छवि नहीं देख सकते हैं)।

मैंने इस तरह के अद्यतन here करने के लिए कुछ कोड पोस्ट किया।

-1

मैं हास्यास्पद सरल कुछ की कोशिश की है:

जाओ FTP के लिए वेबसाइट के फ़ोल्डर और IMG2 को आईएमजी फ़ोल्डर का नाम बदलें। अपनी वेबसाइट रीफ्रेश करें और आप देखेंगे कि छवियां गायब होंगी। फिर आईएमजी 2 को आईएमजी में फ़ोल्डर का नाम बदलें और यह हो गया है, कम से कम यह सफारी में मेरे लिए काम करता है।

+0

यह केवल उन क्लाइंटों के कैश को रीफ्रेश करेगा जिन्होंने पृष्ठ तक पहुंच प्राप्त की है छवि को स्थानांतरित किया गया था और 404. ओपी शायद ऐसा कुछ ढूंढ रहा था जो टाइमपॉइंट पर ध्यान दिए बिना सभी उपयोगकर्ताओं को कैस्केड करेगा। – Compass

2

आप छवि को एक यादृच्छिक संख्या जोड़ सकते हैं जो इसे एक नया संस्करण देने जैसा है। मैंने समान तर्क लागू किया है और यह पूरी तरह से काम कर रहा है।

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

समाधान नीचे कोशिश,

myImg.src = "http://localhost/image.jpg?" + नई तिथि()। getTime();

ऊपर समाधान मेरे लिए काम :)

0

इस कोड स्निपेट का प्रयास करें:

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

यह सुनिश्चित करें कि प्रत्येक अनुरोध अद्वितीय है कर देगा, ताकि आप हमेशा नवीनतम छवि मिल जाएगा।

0

मैं आमतौर पर करते हैं एक ही रूप में @Greg ने हमें बताया है, और मुझे लगता है कि के लिए एक समारोह है:

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

इस के बाद से अपने सर्वर द्वारा इसे स्वीकार करने के लिए काम करेंगे और आप "जादू" पैरामीटर किसी भी उपयोग नहीं करते अन्य रास्ता।

मुझे उम्मीद है कि यह मदद करता है।

+0

जादू? ऐसा इसलिए है amatuer दृष्टिकोण है कि हर बार इसे फिर से लोड किया जाएगा। आज के टाइमस्टैंप को जोड़ने जैसी कुछ करना एक बेहतर समाधान होगा। – user3304007

+1

@ user3304007 यह उपरोक्त कोड के साथ बिल्कुल मेरा उद्देश्य है। चूंकि मेरा उपयोगकर्ता एक छवि और मेरी छवि यूआरएल को हमेशा बदलता है। टाइमस्टैम्प का उपयोग करना मेरी छवि को रीफ्रेश नहीं करेगा। तो, यह शौकिया नहीं है, इसकी डिजाइन द्वारा। –

संबंधित मुद्दे