2008-08-19 18 views
42

में किसी URL पर फ़ाइल पथ को कैसे परिवर्तित करूं मूल रूप से मेरे पास एक विशिष्ट निर्देशिका जांचने के लिए कुछ कोड है, यह देखने के लिए कि कोई छवि वहां है और यदि ऐसा है तो मैं छवि को एक छवि नियंत्रण में एक यूआरएल असाइन करना चाहता हूं।मैं ASP.NET

if (System.IO.Directory.Exists(photosLocation)) 
{ 
    string[] files = System.IO.Directory.GetFiles(photosLocation, "*.jpg"); 
    if (files.Length > 0) 
    { 
     // TODO: return the url of the first file found; 
    } 
} 

उत्तर

13

जहां तक ​​मुझे पता है, आप जो चाहते हैं उसे करने के लिए कोई तरीका नहीं है; कम से कम सीधे नहीं। मैं photosLocation को एप्लिकेशन के सापेक्ष पथ के रूप में स्टोर करता हूं; उदाहरण के लिए: "~/Images/"। इस तरह, आप MapPath ResolveUrl इस्तेमाल कर सकते हैं भौतिक स्थान प्राप्त करने के लिए, और (System.IO.Path से मदद का एक सा के साथ) URL प्राप्त करने:

string photosLocationPath = HttpContext.Current.Server.MapPath(photosLocation); 
if (Directory.Exists(photosLocationPath)) 
{ 
    string[] files = Directory.GetFiles(photosLocationPath, "*.jpg"); 
    if (files.Length > 0) 
    { 
     string filenameRelative = photosLocation + Path.GetFilename(files[0]) 
     return Page.ResolveUrl(filenameRelative); 
    } 
} 
+8

मुझे किसी भी .NET संस्करणों के लिए दस्तावेज़ में HttpRequest के ResolveUrl सदस्य नहीं मिल रहे हैं। क्या आप एएसपी.NET एमवीसी का उपयोग कर रहे हैं? – Jared

+12

@ फ्रेड्रिक के रूप में जेरेड ने इंगित किया है कि HttpRequest ऑब्जेक्ट में यह विधि नहीं है। यह पृष्ठ वस्तु या वेब नियंत्रण ऑब्जेक्ट में पाया जा सकता है। क्या आप इसे प्रतिबिंबित करने के लिए अपना उत्तर संपादित कर सकते हैं? –

+7

'ResolveUrl'' System.Web.HttpRequest' – adripanico

0

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

-2

मुझे लगता है कि यह काम करना चाहिए। यह स्लेश पर बंद हो सकता है। सुनिश्चित नहीं है कि उनकी आवश्यकता है या नहीं।

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0]; 
3

हो सकता है कि यह सबसे अच्छा तरीका नहीं है, लेकिन यह काम करता है।

// Here is your path 
String p = photosLocation + "whatever.jpg"; 

// Here is the page address 
String pa = Page.Request.Url.AbsoluteUri; 

// Take the page name  
String pn = Page.Request.Url.LocalPath; 

// Here is the server address  
String sa = pa.Replace(pn, ""); 

// Take the physical location of the page  
String pl = Page.Request.PhysicalPath; 

// Replace the backslash with slash in your path  
pl = pl.Replace("\\", "/");  
p = p.Replace("\\", "/"); 

// Root path  
String rp = pl.Replace(pn, ""); 

// Take out same path  
String final = p.Replace(rp, ""); 

// So your picture's address is  
String path = sa + final; 

संपादित करें: ठीक है, किसी को मददगार के रूप में चिह्नित नहीं किया गया है। कुछ स्पष्टीकरण: वर्तमान पृष्ठ का भौतिक पथ लें, इसे दो भागों में विभाजित करें: सर्वर और निर्देशिका (जैसे c: \ inetpub \ whatever.com \ whatever) और पृष्ठ का नाम (जैसे/Whatever.aspx)। छवि के भौतिक पथ में सर्वर का पथ होना चाहिए, इसलिए उन्हें "घटाना", केवल सर्वर के सापेक्ष छवि के पथ को छोड़ना (जैसे: \ design \ picture.jpg)। बैकस्लाश को स्लेश के साथ बदलें और इसे सर्वर के यूआरएल में संलग्न करें।

8

मैंने फ्रेडरिक जवाब स्वीकार कर लिया है क्योंकि यह कम से कम प्रयास के साथ समस्या को हल करने के लिए प्रतीत होता है हालांकि अनुरोध ऑब्जेक्ट ResolveUrl विधि को conatin करने के लिए प्रकट नहीं होता है।

myImage.ImageUrl = Page.ResolveUrl(photoURL); 
myImage.ImageUrl = myImage.ResolveUrl(photoURL); 

एक वैकल्पिक, यदि आप एक स्थिर वर्ग का उपयोग कर रहे के रूप में मैं कर रहा हूँ, VirtualPathUtility उपयोग करने के लिए है: इस पृष्ठ वस्तु या एक छवि नियंत्रण वस्तु के माध्यम से पहुँचा जा सकता है

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL); 
0

सरल समाधान वेबसाइट के भीतर एक अस्थायी स्थान होना प्रतीत होता है जिसे आप आसानी से यूआरएल के साथ एक्सेस कर सकते हैं और फिर जब आप उन्हें सहेजने की ज़रूरत होती है तो आप भौतिक स्थान पर फ़ाइलों को स्थानांतरित कर सकते हैं।

1

यह मेरे लिए काम किया:

private string MapURL(string path) 
{ 
    string appPath = Server.MapPath("/").ToLower(); 
    return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/")); 
} 
10

इस मैं क्या उपयोग है।

पर विचार करें:

Site named "tempuri.com/" rooted at c:\domains\site 
virtual directory "~/files" at c:\data\files 
virtual directory "~/files/vip" at c:\data\VIPcust\files 

तो:

Server.MapPath("~/files/vip/readme.txt") 
    = "c:\data\VIPcust\files\readme.txt" 

लेकिन वहाँ है कोई तरीका यह है:

MagicResolve("c:\data\VIPcust\files\readme.txt") 
    = "http://tempuri.com/files/vip/readme.txt" 

एक पूरी सूची प्राप्त करने के लिए कोई रास्ता नहीं है क्योंकि वहाँ वर्चुअल निर्देशिकाओं का।

+0

का सदस्य नहीं है, इसके लिए धन्यवाद, यहां यह 'सर्वर' -' सार्वजनिक स्थिर स्ट्रिंग MapUrl (यह HttpServerUtilityBase सर्वर, स्ट्रिंग पथ) पर एक एक्सटेंशन विधि के रूप में है। – B2K

10

इन सभी प्रश्नों के उत्तर के साथ समस्या यह है कि वे खाते में वर्चुअल निर्देशिका नहीं लेते:

HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName"; 
0

के लिए यूआरएल के बाएं हिस्से मिलती है:

?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) 
"http://localhost:1714" 

के लिए आवेदन (वेब) नाम:

?HttpRuntime.AppDomainAppVirtualPath 
"/" 
इस के साथ

, आपको लगता है कि प्राप्त करने के बाद अपने रिश्तेदार पथ को जोड़ने के लिए उपलब्ध हैं पूरा यूआरएल