В основном у меня есть код для проверки определенного каталога, чтобы увидеть, есть ли там изображение, и если да, я хочу назначить 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;
}
}





Насколько я знаю, не существует единственной функции, которая бы это делала (может быть, вы искали инверсию MapPath?). Хотелось бы узнать, существует ли такая функция. А пока я бы просто взял имена файлов, возвращаемых GetFiles, удалил путь и добавил корень URL-адреса. Это можно сделать в общем случае.
Я думаю, это должно сработать. Это может быть отключено на косых чертах. Не уверен, нужны они или нет.
string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
Насколько я знаю, нет способа делать то, что вы хотите; по крайней мере, не напрямую. Я бы сохранил 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);
}
}
@Fredrik Как указал Джаред, объект HttpRequest не имеет этого метода. Его можно найти в объекте Page или в объекте веб-элемента управления. Не могли бы вы отредактировать свой ответ, чтобы отразить это?
Возможно, это не лучший способ, но он работает.
// 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 \ something.com \ something) и имя страницы (например, /Whatever.aspx). Физический путь изображения должен содержать путь сервера, поэтому «вычтите» их, оставив только путь изображения относительно пути сервера (например: \ design \ picture.jpg). Замените обратную косую черту на косую черту и добавьте ее к URL-адресу сервера.
Я принял ответ Фредрикса, поскольку он, похоже, решает проблему с наименьшими усилиями, однако объект 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";
Отличный ответ! должно иметь больше голосов за. Более подробно, вам нужен переключатель для работы с AppDomainAppVirtualPath, потому что, если веб-сайт находится в корне, VirtualPath будет пустой строкой, поэтому косая черта перед именем файла не требуется, если VirtualPath заполнен, вам нужно добавить лишняя косая черта. 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"
потому что нет возможности получить полный список виртуальных каталогов.
Есть проблема с безопасностью. В общем, одно веб-приложение не должно иметь возможности делать что-либо с сервером за пределами его собственного веб-корня. Если это действительно то, что вы хотите, вы можете сделать это, запросив метабазу IIS, примерно так: stackoverflow.com/questions/4710187/…. Но ваше веб-приложение должно работать с опасно высокими привилегиями. Если двум веб-приложениям необходимо обмениваться файлами, лучше реализовать для них службы.
Возможно, отображение может быть не уникальным. Два виртуальных каталога могут быть сопоставлены с одной и той же папкой NTFS.
Чтобы получить левую часть URL:
?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
"http://localhost:1714"
Чтобы получить название приложения (веб):
?HttpRuntime.AppDomainAppVirtualPath
"/"
При этом вы можете добавить свой относительный путь после этого, получив полный URL-адрес.
Я не могу найти члена ResolveUrl HttpRequest в документации ни для одной из версий .Net. Вы используете ASP.Net MVC?