2009-04-04 10 views
13

मुझे आपका औसत ई-कॉमर्स ऐप मिला है, मैं डेटाबेस में ITEM_IMAGE_NAME स्टोर करता हूं, और कभी-कभी प्रबंधकों को छवि का नाम मिस्सेल करता है।निर्दिष्ट छवि फ़ाइल नहीं मिली है तो डिफ़ॉल्ट छवि को प्रदर्शित करने का सबसे अच्छा तरीका?

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

जहां तक ​​मैं यह कह सकता हूं प्रदर्शन को प्रभावित नहीं करता है, लेकिन अगर मैं "गायब छवि" समस्या को ठीक करने के लिए कोई विकल्प हैं तो सोच रहा था।

मैं ASP.NET + सी # (.NET 3.5) का उपयोग कर रहा

कुछ कोड: या कार्यक्रम:

foreach (Item item in Items) 
{ 
    string path = Path.Combine("~/images/", item.categoryImage); 
    item.categoryImage = File.Exists(Server.MapPath(path)) ? item.categoryImage : GetImageDependingOnItemType(); 
} 
+0

क्या आप उपयोगकर्ताओं को सतर्क करने से बेहतर नहीं होंगे कि उनका इनपुट असंगत था? क्या किसी कारण से यह अव्यवहारिक है? – dmckee

+0

मैं बैच-आयात की अनुमति देता हूं। छवियों के साथ सीएसवी + ज़िप। उस प्रक्रिया के दौरान वैधता की जांच करना बोझिल –

+0

आह ठीक है। वैसे भी यह एक अच्छा विचार था। मुझे लगता है कि आप * उन्हें एक अलग उपकरण बंद कर सकते हैं, लेकिन आपको अभी भी अपनी समस्या का समाधान करना होगा ... – dmckee

उत्तर

40

आप जावास्क्रिप्ट

<img src="image.jpg" onerror="this.onerror=null;this.src='default.jpg'"> 

संपादित के साथ कुछ सोच सकते हैं एक 404.aspx एक डिफ़ॉल्ट छवि लौट रहा है, अगर कोई nonexisting छवि का अनुरोध किया गया था।

+0

अच्छा अच्छा ... कभी भी "आतंक" संपत्ति के बारे में नहीं सुना –

+0

यह डब्ल्यू 3 सी मानक में नहीं है - लेकिन अधिकांश ब्राउज़रों में काम करता है । मुझे लगता है कि ... – Erik

+2

यदि उपयोगकर्ता जावास्क्रिप्ट सक्षम नहीं है तो क्या होगा? – kevindaub

1

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

+0

समस्या यह है कि छवि को गतिशील होना चाहिए –

0

मुझे लगता है कि आपका रास्ता काफी ठीक है। मैं इसे एक समारोह में करूँगा या करूँगा। श्रेणी इमेज एक्सेसर।

0

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

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

+0

डेटा स्थिरता अच्छी है, लेकिन बैच-आयात (छवियों के साथ सीएसवी + ज़िप) के साथ यह सीधा नहीं है –

+0

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

2
<style> 
    .fallback { background-image: url("fallback.png"); } 
</style> 

<img class="fallback" src="missing.png" width="400" height="300"> 

missing.png हैं भार है, यह के रूप में अगर वापस आने निर्दिष्ट नहीं किया गया, अंतरिक्ष इसके लिए आवंटित कवर किया जाएगा। (मान लीजिए कि यह पारदर्शी नहीं है।)

यदि missing.png लोड करने में विफल रहता है, तो स्थान fallback.png से भरा जाएगा। आपको अभी भी एक छोटी "टूटी हुई छवि" आइकन मिल जाएगी, लेकिन मैं इसे इस तरह से पसंद करता हूं ... एक छोटा संकेत जो "मुझे ठीक करें" कहता है।

यदि आपकी छवियां एक ही आकार के नहीं हैं, तो आप देखेंगे कि डिफ़ॉल्ट रूप से पृष्ठभूमि टाइल्स। यदि आप इसे पसंद नहीं करते हैं तो आप background-repeat: no-repeat; का उपयोग कर सकते हैं।

0

मुझे एरिक के समाधान पसंद हैं, लेकिन पहले निष्पादन के बाद घटना को हटाए बिना, क्योंकि यदि आप उस कोड का उपयोग कर रहे हैं, तो मान लें कि, एक एमवीसी आंशिक दृश्य, यह केवल पहली बार लोड होने पर ही काम करेगा।

<img src="image.jpg" onerror="this.src='default.jpg';" /> 

मामले में आप एक ही स्थिति में कई छवियों है, एक ग्रिड की तरह, तो आप इस बजाय कर सकते हैं:: तो मैं के साथ जाना चाहते हैं

$("img").on("error", function() { 
    $(this).attr('src', 'default.jpg'); 
}); 

बेशक , आप कर सकते हैं एक और अधिक विशिष्ट jQuery चयनकर्ता का उपयोग करें।

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