كيف يمكنني تحويل مسار ملف إلى عنوان URL في ASP.NET

StackOverflow https://stackoverflow.com/questions/16007

  •  08-06-2019
  •  | 
  •  

سؤال

لدي في الأساس بعض التعليمات البرمجية للتحقق من دليل معين لمعرفة ما إذا كانت الصورة موجودة أم لا، وإذا كان الأمر كذلك، فأنا أريد تعيين عنوان URL للصورة إلى ImageControl.

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;
    }
}
هل كانت مفيدة؟

المحلول

على حد علمي، لا توجد طريقة لفعل ما تريد؛على الأقل ليس بشكل مباشر.سأقوم بتخزين photosLocation كمسار نسبة إلى التطبيق؛على سبيل المثال: "~/Images/".بهذه الطريقة، يمكنك استخدام MapPath للحصول على الموقع الفعلي، و ResolveUrl للحصول على عنوان URL (مع قليل من المساعدة من System.IO.Path):

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);
    }
}

نصائح أخرى

هذا ما أستخدمه:

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

المشكلة في كل هذه الإجابات هي أنها لا تأخذ الدلائل الافتراضية في الاعتبار.

يعتبر:

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"

لأنه لا توجد وسيلة للحصول على قائمة كاملة من الدلائل الافتراضية.

لقد قبلت إجابة Fredriks لأنه يبدو أنها تحل المشكلة بأقل قدر من الجهد ولكن يبدو أن كائن الطلب لا يتوافق مع طريقة ResolveUrl.يمكن الوصول إلى ذلك من خلال كائن الصفحة أو كائن التحكم في الصورة:

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

البديل، إذا كنت تستخدم فئة ثابتة مثلي، هو استخدام VirtualPathUtility:

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);

ربما ليست هذه هي الطريقة الأفضل، لكنها تعمل.

// 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).يجب أن يحتوي المسار الفعلي للصورة على مسار الخادم، لذا "اطرحه" واترك فقط مسار الصورة بالنسبة لمسار الخادم (مثل:\تصميم\صورة.jpg).استبدل الخطوط المائلة العكسية بخطوط مائلة وألحقها بعنوان URL الخاص بالخادم.

لقد نجح هذا بالنسبة لي:

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

على حد علمي لا توجد وظيفة واحدة تقوم بذلك (ربما كنت تبحث عن عكس MapPath؟).أحب أن أعرف إذا كانت هذه الوظيفة موجودة.حتى ذلك الحين، سأقوم فقط بأخذ اسم (أسماء) الملفات التي تم إرجاعها بواسطة GetFiles، وإزالة المسار، وإضافة جذر URL مسبقًا.يمكن القيام بذلك بشكل عام.

يبدو أن الحل البسيط هو وجود موقع مؤقت داخل موقع الويب يمكنك الوصول إليه بسهولة باستخدام عنوان URL ومن ثم يمكنك نقل الملفات إلى الموقع الفعلي عندما تحتاج إلى حفظها.

للحصول على الجزء الأيسر من عنوان URL:

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

للحصول على اسم التطبيق (الويب):

?HttpRuntime.AppDomainAppVirtualPath
"/"

وبهذا، يمكنك إضافة المسار النسبي الخاص بك ثم الحصول على عنوان URL الكامل.

وأعتقد أن هذا يجب أن تعمل.قد يكون خارج على مائلة.لست متأكدا إذا كانت هناك حاجة إليها أم لا.

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top