В основном у меня есть некоторый код для проверки определенного каталога, чтобы увидеть, есть ли изображение, и если да, я хочу назначить 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);
}
}
Насколько я знаю, нет единственной функции, которая делает это (может быть, вы искали инверсию MapPath ?). Я хотел бы знать, если такая функция существует. До этого я просто брал имя (имена), возвращаемое GetFiles, удалял путь и добавлял корень URL. Это может быть сделано в общем.
Я думаю, что это должно работать. Это может быть на слэш. Не уверен, нужны ли они или нет.
string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
Может быть, это не лучший способ, но это работает.
// 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 \ what.com.com) и имя страницы (например, /Whwhat.aspx). Физический путь к изображению должен содержать путь к серверу, поэтому «вычтите» их, оставив только путь к изображению относительно сервера (например: \ design \ picture.jpg). Замените обратную косую черту косой чертой и добавьте ее к URL-адресу сервера.
Я принял ответ Fredriks, так как он, похоже, решает проблему с наименьшим усилием, однако объект Request, по-видимому, не содержит метод ResolveUrl. Доступ к этому можно получить через объект Page или объект управления Image:
myImage.ImageUrl = Page.ResolveUrl(photoURL);
myImage.ImageUrl = myImage.ResolveUrl(photoURL);
Альтернативой, если вы используете статический класс, как я, является использование VirtualPathUtility:
myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
Простое решение, как представляется, заключается в том, чтобы иметь временное местоположение на веб-сайте, к которому можно легко получить доступ с помощью URL, а затем вы можете перемещать файлы в физическое местоположение, когда вам необходимо их сохранить.
Это сработало для меня:
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
string sVPath = HttpRuntime.AppDomainAppVirtualPath; if (sVPath.Length > 0) sVPath += "/"; string sCSSURL = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + sVPath + "myImage.jpg";
это то, что я использую:
private string MapURL(string path)
{
string appPath = Server.MapPath("/").ToLower();
return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
}
Server
-public static string MapUrl(this HttpServerUtilityBase Server, string path)
Проблема всех этих ответов заключается в том, что они не принимают во внимание виртуальные каталоги.
Рассматривать:
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"
потому что нет никакого способа получить полный список виртуальных каталогов.
Для получения левой части URL:
?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
"http://localhost:1714"
Для получения названия приложения (веб):
?HttpRuntime.AppDomainAppVirtualPath
"/"
Благодаря этому вы можете добавить свой относительный путь после получения полного URL.