दिलचस्प पोस्ट
एसक्यूएल – पंक्तियों से घटती मूल्य को घटाना मैं एक एमवीसी नियंत्रक में System.IO.File विधियों का उपयोग क्यों नहीं कर सकता? सॉफ्ट कीबोर्ड केवल एक बार टेक्स्ट पर ध्यान केंद्रित करते हैं एंड्रॉइड डिज़ाइन समर्थन लाइब्रेरी विस्तार योग्य फ़्लोटिंग एक्शन बटन (एफएबी) मेन्यू Scanf के बाद सेफ़फ़ॉल्ट? jQuery – एक div के साथ कर्सर का पालन करें आप कैसे अनुकूलित करते हैं कि JAXB बहुवचन विधि नाम कैसे उत्पन्न करता है? कैसे दो जार फ़ाइलें गठबंधन करने के लिए टाईल्स को एक ही समय में केंद्रित और बाएं-उचित कैसे प्राप्त करें हम अन्य डेटा संरचनाओं के बजाय एरेज़ का उपयोग क्यों करते हैं? ListView और ListView के अंदर बटन यूनिकोड वर्ण कितने बाइट लेते हैं? मैं जावास्क्रिप्ट में ऑटोरेटेड किडेडाउन इवेंट्स से कैसे बच सकता हूं? अगर मैं एक jQuery की पृष्ठभूमि है "AngularJS में सोच" कैसे दो निर्दिष्ट तारीख के बीच की तारीखों को खोजने के लिए?

छवियों को कैश करने के लिए एक वेब ब्राउज़र को लागू करने के लिए कैसे करें

पृष्ठभूमि

मैं दो प्रो-निमंत्रण वेबसाइटों के लिए एक बहुत ही सरल सीजीआई आधारित (पर्ल) सामग्री प्रबंधन उपकरण लिख रहा हूं और प्रयोग कर रहा हूं I यह वेब साइट व्यवस्थापक को उन घटनाओं के लिए एचटीएमएल फॉर्म के साथ प्रदान करता है जहां वे फ़ील्ड (तिथि, स्थान, शीर्षक, विवरण, लिंक, आदि) को भरते हैं और इसे बचाते हैं। उस रूप में मैं व्यवस्थापक को घटना से संबंधित एक छवि अपलोड करने की अनुमति देता हूं। प्रपत्र को प्रदर्शित करने वाले HTML पृष्ठ पर, मैं अपलोड की गई तस्वीर (एचटीएमएल आईएमजी टैग) का एक पूर्वावलोकन भी दिखा रहा हूं।

समस्या

समस्या तब होती है जब व्यवस्थापक चित्र को बदलना चाहता है। उन्हें "ब्राउज" बटन को हिट करना होगा, एक नई तस्वीर चुननी होगी और ठीक से दबाएं। और यह ठीक काम करता है

छवि अपलोड होने के बाद, मेरा बैक-एंड सीजीआई अपलोड को संभालता है और फ़ॉर्म को ठीक से पुनः लोड करता है।

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

मेरा समाधान – कार्य नहीं करना

मैं लिखकर कैश को नियंत्रित करने की कोशिश कर रहा हूं, जो एक अतीत में बहुत समय तक एक HTTP अनुदेश समाप्त होता है।

Expires: Mon, 15 Sep 2003 1:00:00 GMT 

याद रखें कि मैं प्रशासनिक पक्ष में हूं और मुझे वास्तव में परवाह नहीं है अगर पेजों को लोड करने में थोड़ी देर लगती है क्योंकि वे हमेशा समाप्त हो जाती हैं

लेकिन, यह या तो काम नहीं करता है

टिप्पणियाँ

छवि को अपलोड करते समय, उसका फ़ाइल नाम डेटाबेस में नहीं रखा जाता है। इसका नाम बदल दिया गया है छवि। जेपीजी (इसे इस्तेमाल करने के दौरान केवल चीजों के लिए)। मौजूदा छवि को किसी नए के साथ बदलते समय, नाम बदल नहीं होता है बस छवि फ़ाइल परिवर्तन की सामग्री।

वेबसर्वर होस्टिंग सेवा / आईएसपी द्वारा प्रदान की जाती है यह अपाचे का उपयोग करता है

सवाल

क्या इस वेब ब्राउज़र को इस पृष्ठ से चीजों को कैश करने के लिए मजबूर करने का एक तरीका है, चित्र भी नहीं?

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

Solutions Collecting From Web of "छवियों को कैश करने के लिए एक वेब ब्राउज़र को लागू करने के लिए कैसे करें"

अर्मीन Ronacher सही विचार है समस्या यह है कि यादृच्छिक स्ट्रिंग टकरा सकती है। मै इस्तेमाल करूंगा:

 <img src="picture.jpg?1222259157.415" alt=""> 

जहां "122225 9157.415" सर्वर पर वर्तमान समय है (नोट: मैंने अजगर का समय इस्तेमाल किया। समय () उत्पन्न करने के लिए)

साधारण सुधार: छवि में एक यादृच्छिक क्वेरी स्ट्रिंग संलग्न करें:

 <img src="foo.cgi?random=323527528432525.24234" alt=""> 

HTTP आरएफसी क्या कहते हैं:

 Cache-Control: no-cache 

लेकिन वह अच्छी तरह से काम नहीं करता 🙂

मैं PHP का फ़ाइल संशोधित समय फ़ंक्शन का उपयोग करता हूं, उदाहरण के लिए:

 echo <img src='Images/image.png?" . filemtime('Images/image.png') . "' />"; 

यदि आप इमेज बदलते हैं तो नई इमेज कैश्ड की बजाय प्रयोग की जाती है, एक अलग संशोधित टाइमस्टैम्प होने के कारण।

मै इस्तेमाल करूंगा:

 <img src="picture.jpg?20130910043254"> 

जहां "20130910043254" फ़ाइल का संशोधन समय है।

छवि को अपलोड करते समय, उसका फ़ाइल नाम डेटाबेस में नहीं रखा जाता है। इसका नाम बदल दिया गया है छवि। जेपीजी (इसे इस्तेमाल करने के दौरान केवल चीजों के लिए)। मौजूदा छवि को किसी नए के साथ बदलते समय, नाम बदल नहीं होता है बस छवि फ़ाइल परिवर्तन की सामग्री।

मुझे लगता है कि सरल समाधानों के दो प्रकार हैं: 1) जो पहले दिमाग में आते हैं (सरल समाधान, क्योंकि वे साथ आना आसान है), 2) उन चीजों को सोचने के बाद जिनके साथ आप समाप्त होते हैं (क्योंकि वे आसान हैं उपयोग)। जाहिर है, अगर आपको लगता है कि चीजों को खत्म करने के लिए चुना है, तो आपको हमेशा लाभ नहीं होगा लेकिन दूसरा विकल्प बल्कि कम करके आंका गया है, मुझे विश्वास है। बस php इतना लोकप्रिय है क्यों लगता है;)

आप छवियों की सेवा के लिए एक प्रॉक्सी स्क्रिप्ट लिख सकते हैं – हालांकि थोड़ी अधिक काम हो सकता है कुछ ऐसा पसंद है:

HTML:

 <img src="image.php?img=imageFile.jpg&some-random-number-262376" /> 

स्क्रिप्ट:

 // PHP if( isset( $_GET['img'] ) && is_file( IMG_PATH . $_GET['img'] ) ) { // read contents $f = open( IMG_PATH . $_GET['img'] ); $img = $f.read(); $f.close(); // no-cache headers - complete set // these copied from [php.net/header][1], tested myself - works header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Some time in the past header("Last-Modified: " . gmdate("D, d MYH:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); // image related headers header('Accept-Ranges: bytes'); header('Content-Length: '.strlen( $img )); // How many bytes we're going to send header('Content-Type: image/jpeg'); // or image/png etc // actual image echo $img; exit(); } 

दरअसल, छवि संहिता पर कोई भी कैश हेडर या यादृच्छिक संख्या पर्याप्त नहीं होनी चाहिए, लेकिन चूंकि हम बुलेट प्रूफ बनना चाहते हैं ..

मैं एक नया सांकेतिक शब्दों में कहला रहा हूं, लेकिन ब्राउज़र के कैशिंग को रोकने और मेरे वेबकैम के दृश्यों को पकड़ने के लिए, मैं यहां आया हूं:

 <meta Http-Equiv="Cache" content="no-cache"> <meta Http-Equiv="Pragma-Control" content="no-cache"> <meta Http-Equiv="Cache-directive" Content="no-cache"> <meta Http-Equiv="Pragma-directive" Content="no-cache"> <meta Http-Equiv="Cache-Control" Content="no-cache"> <meta Http-Equiv="Pragma" Content="no-cache"> <meta Http-Equiv="Expires" Content="0"> <meta Http-Equiv="Pragma-directive: no-cache"> <meta Http-Equiv="Cache-directive: no-cache"> 

क्या ब्राउज़र पर क्या काम करता है, लेकिन यह कुछ के लिए काम करता है: IE: जब वेबपृष्ठ रीफ्रेश किया जाता है और जब वेबसाइट पर दोबारा गौर किया जाता है तब काम करता है (बिना ताज़ा किए)। क्रोम: केवल तब काम करता है जब वेबपेज रीफ्रेश होता है (फिर से फिर से आना)। सुरक्षा और आईपैड: काम नहीं करता, मुझे इतिहास और वेब डेटा को साफ़ करना होगा

सफ़ारी / आईपैड पर कोई विचार?

छवि को अपलोड करते समय, उसका फ़ाइल नाम डेटाबेस में नहीं रखा जाता है। इसका नाम बदल दिया गया है छवि। जेपीजी (इसे इस्तेमाल करने के दौरान केवल चीजों के लिए)।

इसे बदलें, और आपने अपनी समस्या तय की है। मैं टाइमस्टैंप का उपयोग करता हूं, जैसा कि ऊपर प्रस्तावित समाधानों के साथ: छवि- <timestamp> .jpg

संभवतया, छवि के लिए समान फ़ाइल नाम रखकर आप जो भी समस्याएं टाल रहे हैं, उसे दूर किया जा सकता है, लेकिन आप यह नहीं कह सकते कि वे क्या हैं।

मैंने वेब के चारों ओर सभी उत्तरों की जांच की और सबसे अच्छा एक ऐसा लग रहा था: (वास्तव में यह नहीं है)

 <img src="image.png?cache=none"> 

सर्वप्रथम।

हालांकि, यदि आप कैश = कोई पैरामीटर जोड़ते हैं (जो कि स्थिर "कोई नहीं" शब्द है), यह कुछ भी प्रभावित नहीं करता है, ब्राउज़र अब कैश से लोड करता है।

इस समस्या का समाधान था:

 <img src="image.png?nocache=<?php echo time(); ?>"> 

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

हालांकि, मेरी समस्या थोड़ी अलग थी: मैं उड़ने वाली php चार्ट छवि पर लोड कर रहा था और $ _GET पैरामीटर वाले पृष्ठ को नियंत्रित कर रहा था। मैं चाहता हूं कि छवि को कैश से पढ़ा जाए, जब यूआरएल जीईटी पैरामीटर एक ही रहता है, और जीईटी पैरामीटर बदलते समय कैश नहीं करते।

इस समस्या को हल करने के लिए, मुझे $ _GET हैश करने की आवश्यकता है, लेकिन चूंकि यह यहां सरणी है:

 $chart_hash = md5(implode('-', $_GET)); echo "<img src='/images/mychart.png?hash=$chart_hash'>"; 

संपादित करें :

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

 echo "<img src='/images/mychart.png?hash=" . filemtime('mychart.png') . "'>"; 

filemtime () फ़ाइल संशोधन समय मिलता है

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

यदि उस टाइमस्टैम्प को छवि के अंतिम अपडेट समय से मेल खाती है, तो आप जब चाहें कैश कर सकते हैं और नई छवि को सही समय पर प्रदान कर सकते हैं।

मैं मूल प्रश्न मानता हूं कि कुछ पाठ जानकारी में संग्रहीत छवियों का संबंध है इसलिए, यदि आपके पास src = … url उत्पन्न करते समय एक पाठ संदर्भ तक पहुंच हो, तो बेमानी यादृच्छिक या समय स्टाम्प के बजाय छवि बाइट्स के CRC32 स्टोर / उपयोग करें। फिर, अगर बहुत सारे चित्र प्रदर्शित होने वाला पृष्ठ प्रदर्शित हो रहा है, तो केवल अपडेट की गई छवियों को पुनः लोड किया जाएगा। आखिरकार, अगर सीआरसी भंडारण असंभव है, तो यह युग्म पर रनटाइम पर गणना और जोड़ा जा सकता है।

आपकी समस्या यह है कि समय Expires: होने के बावजूद Expires: हेडर, आपका ब्राउज़र उसकी कैश की जांच करने के बजाय, इसके अपडेट होने से पहले की छवि की अपनी इन-मेमरी प्रति फिर से उपयोग कर रहा है।

मेरे पास स्टोर की तरह एक साइट के लिए व्यवस्थापक बैकएंड में उत्पाद छवियों को अपलोड करना एक बहुत ही समान स्थिति थी, और मेरे मामले में मैंने तय किया कि किसी भी URL-संशोधित तकनीकों का उपयोग किए बिना किसी अन्य छवि को ताज़ा करने के लिए जावास्क्रिप्ट का उपयोग करने का सबसे अच्छा विकल्प अन्य लोगों पहले से ही यहां उल्लेख किया है इसके बजाय, मैं IFRAME की खिड़की पर एक छिपी IFRAME, जिसे location.reload(true) कहा जाता है, में छवि यूआरएल डाल दिया और फिर मेरी छवि को पेज पर बदल दिया। यह केवल उस पृष्ठ पर न केवल छवि पर ताज़ा करता है, बल्कि किसी भी बाद के पन्नों पर भी जाता है – मैं किसी क्लाइंट या सर्वर को बिना किसी URL क्वेरीस्ट्रिंग या खंड पहचानकर्ता पैरामीटर को याद रखता हूं।

मैंने अपने जवाब में यह करने के लिए कुछ कोड पोस्ट किया है ।

मेरी दृष्टि से, छवियों को कैशिंग अक्षम करना एक बुरा विचार है। बिलकुल।

मूल समस्या यहां है – ब्राउज़र को छवि अपडेट करने के लिए मजबूर कैसे करें, जब इसे सर्वर साइड पर अपडेट किया गया है

फिर, मेरे व्यक्तिगत दृष्टिकोण से, सबसे अच्छा समाधान छवियों के लिए सीधी पहुंच को अक्षम करना है। इसके बजाय सर्वर साइड फिल्टर / सर्वलेट / अन्य समान उपकरण / सेवाओं के माध्यम से चित्रों का उपयोग करें।

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

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

इस मामले में, यूआरएल में कुछ यादृच्छिक / संस्करण पैरामीटर जोड़ना, ऐसा लगता है, एकमात्र समाधान है।