2009-08-08 7 views
6

में समान रूट यूआरएल पथ से छवियों की सेवा करना यहां मैं क्या करना चाहता हूं। मेरे पास ऐसी सामग्री है जो मैं एक दृश्य में लिख रहा हूं। इस सामग्री में छवि संदर्भ हैं जो दस्तावेज़ सापेक्ष हैं। उदाहरण के लिए, अगर मैं निम्नलिखित URL पर देख रहा हूँ:एएसपी.नेट एमवीसी

<img src="myimage.png" /> 

यह स्पष्ट रूप से छवि के लिए क्वेरी करने के लिए ब्राउज़र का कारण होगा:

http://localhost/article/8AB98/ 

सामग्री निम्नलिखित रूप में एक छवि हो सकता है निम्नलिखित यूआरएल पर:

http://localhost/article/8AB98/myimage.png 

हालांकि, एमवीसी रूटिंग के कारण, यह छवि नहीं मिलेगी। क्या आप एक साधारण तरीके से जानते हैं कि मैं उस URL को ब्राउज़र पर सही छवि वापस करने का कारण बन सकता हूं?

कृपया ध्यान दें: यह वास्तव में महत्वपूर्ण है कि मार्कअप मूल से अछूता रहना है ... इसका मतलब है कि किसी भी तरह तो वे वर्तमान दृश्य के URL के बाहर किसी अन्य फ़ोल्डर को इंगित छवि यूआरएल को फिर से लिखकर सवाल से बाहर दुर्भाग्य है ।

धन्यवाद !!

उत्तर

5

मैं यह सोचते हैं रहा हूँ कि जब आप कहते हैं कि "यह वास्तव में महत्वपूर्ण है कि मार्कअप मूल से अछूता रहना" क्या आपका मतलब है कि

<img src="myimage.png" /> 

क्या ब्राउज़र को प्रदान की गई किया जाना चाहिए है और इसलिए आपको धोखा देने की जरूरत है

http://localhost/article/8AB98/myimage.png 

का अनुरोध URL ले रहे हैं और केवल उस जानकारी का उपयोग सही छवि मिल जाए, भी आप यह संग्रहीत किया है, और यह ब्राउज़र पर लौटने के लिए में वेब सर्वर।

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

विकल्प 1 - यूआरएल Rewriter

ISAPI_Rewrite की एक प्रति खरीदें और सभी URL फिर से लिखा उपरोक्त मानदंडों को पूरा इतना है कि वे जहाँ भी यह रहता छवि प्राप्त जाना है। ISAPI_Rewrite here पर और अधिक।

विकल्प 2 - कस्टम HttpHandler

आप एक HttpHandler सभी PNG फ़ाइल अनुरोध करता है कि अनुरोध URL पार्स करके उसे छवि को खोजने के लिए है, तो ऐसा करने के लिए यह प्रतिक्रिया स्ट्रीम पर लौटने की जरूरत है क्या करता है के लिए मैप किए लिख सकता है । इसका नकारात्मक पक्ष यह है कि आपको आईआईएस को सभी पीएनजी अनुरोधों को मैप करने के लिए aspnet_isapi.dll के माध्यम से जाने के लिए कहना होगा जो एक प्रदर्शन बमर हो सकता है।

मुझे अभी भी यकीन नहीं है कि मैं आपकी समस्या को सही ढंग से समझता हूं लेकिन मुझे आशा है कि इससे मदद मिलेगी। सौभाग्य।

+0

मैंने आपके दो विकल्पों का बिल्कुल उपयोग नहीं किया था, लेकिन आखिरकार यह समाधान हल हुआ जिसने इसे हल किया :-) मैं ' विवरण के साथ प्रश्न का एक और जवाब पोस्ट करेंगे –

1

एक तरह से यह करने के लिए छवि फ़ाइलों के लिए एक IgnoreRoute में डालने के लिए होगा:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("article/{ArticleID}/{name}.png"); 
    ... 
6

आप Url.Content() विधि का उपयोग कर सकते हैं।

<img src="<%= Url.Content("~/images/myimage.png") %>" /> 

जो एप्लिकेशन रूट से यूआरएल को हल करेगा।

+1

मैं एक सहायक लिखने का लुत्फ उठाऊंगा ताकि आप केवल HTML प्राप्त कर सकें। इमेज ("~/images/myimage। पीएनजी "," myAltText "); और आपकी सहायक विधि मूल रूप से फिल के कोड के बदले में वापसी करेगी। –

+0

हाय फिल ... "myimage.png" से यूआरएल बदल रहा है, जो url.content वापस आ जाएगा, संभव नहीं है, क्योंकि सामग्री का मार्कअप बदलने के लिए मेरा नहीं है। उस तथ्य के अलावा, मुझे वास्तव में ब्राउजर में प्रस्तुत करने के लिए इस मार्कअप () की आवश्यकता है (जैसा कि @ थिंकज़िग उल्लेख किया गया है) –

-1

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

public ActionResult Image(string id, string image) 
{ 
    string articlePath = Server.MapPath("~/views/article/"); 
    string filePath = Path.Combine(articlePath, string.Format("{0}/{1}", id, image)); 
    return this.File(filePath, "image"); 
} 

एक अन्य छोटी बात मैं का सामना करना पड़ा था:

routes.MapRoute("Image", "article/{id}/{image}", new { controller = "Article", action = "Image" }); 
routes.MapRoute("Article", "article/{id}", new { controller = "Article", action = "Index" }); 

इस नए कार्रवाई विधि बस filepath articleID और छवि नाम के आधार पर निर्माण करती है। यदि उपयोगकर्ता लेख बिना किसी पीछे की स्लैश (http://localhost/article/8AB98) तक पहुंचता है, तो ब्राउज़र सोचता है कि आलेख आईडी फ़ाइल है, और छवि गलत फ़ोल्डर (http://localhost/article/img.png) ढूंढने का प्रयास करता है।

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

अनुच्छेद कार्रवाई में :

if (id.Contains(".")) 
{ 
    return RedirectToImage(id); 
} 

और फिर redirecttoimage कोड जो आईडी और फ़ाइल नाम

private ActionResult RedirectToImage(string id) 
{ 
    if (Request.UrlReferrer == null) 
    { 
     return Content("invalid request"); 
    } 

    var referrer = Request.UrlReferrer.ToString(); 
    if (referrer.Contains("?")) 
    { 
     referrer = referrer.Split('?')[0]; 
    } 

    var realId = Path.GetFileName(referrer); 
    return this.Image(realId, id); 
} 

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