Как преобразовать путь к URL-адресу в ASP.NET
В основном у меня есть некоторый код для проверки определенного каталога, чтобы увидеть, есть ли изображение, и если это так, я хочу присвоить 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;
}
}
Ответы
Ответ 1
Насколько я знаю, нет способа делать то, что вы хотите; по крайней мере, не напрямую. Я бы сохранил 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);
}
}
Ответ 2
это то, что я использую:
private string MapURL(string path)
{
string appPath = Server.MapPath("/").ToLower();
return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
}
Ответ 3
Проблема со всеми этими ответами заключается в том, что они не учитывают виртуальные каталоги.
Рассмотрим:
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"
потому что нет возможности получить полный список виртуальных каталогов.
Ответ 4
Я принял решение Fredriks, поскольку он, как представляется, решает проблему с наименьшим количеством усилий, однако объект Request не кажется conatin методом ResolveUrl.
Доступ к этому объекту возможен через объект Page или объект управления Image:
myImage.ImageUrl = Page.ResolveUrl(photoURL);
myImage.ImageUrl = myImage.ResolveUrl(photoURL);
Альтернативой, если вы используете статический класс, как я, является использование VirtualPathUtility:
myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
Ответ 5
Возможно, это не самый лучший способ, но он работает.
// 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 address is
String path = sa + final;
Изменить: Хорошо, кто-то помечен как не полезный. Некоторое объяснение: возьмите физический путь текущей страницы, разделите ее на две части: сервер и каталог (например, c:\inetpub\whatever.com\whatever) и имя страницы (например,/Whatever.aspx). Физический путь изображения должен содержать путь к серверу, поэтому "вычитайте" их, оставив только путь изображения относительно сервера (например:\design\picture.jpg). Замените обратную косую черту косой чертой и добавьте ее на URL-адрес сервера.
Ответ 6
Это сработало для меня:
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
Ответ 7
Насколько я знаю, нет ни одной функции, которая делает это (возможно, вы искали обратный MapPath?). Мне бы хотелось знать, существует ли такая функция. До тех пор я бы просто взял имя файла, возвращенное GetFiles, удалив путь и добавлю корневой URL. Это можно сделать в общем случае.
Ответ 8
Простое решение состоит в том, чтобы иметь временное местоположение на веб-сайте, к которому вы можете легко получить доступ с помощью URL-адреса, а затем вы можете перемещать файлы в физическое местоположение, когда вам нужно их сохранить.
Ответ 9
Для получения левой части URL-адреса:
?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
"http://localhost:1714"
Для получения имени приложения (сети):
?HttpRuntime.AppDomainAppVirtualPath
"/"
При этом вы можете добавить свой относительный путь после получения полного URL-адреса.
Ответ 10
Я думаю, это должно сработать. Это может быть отключено. Не уверены, нужны они или нет.
string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];