Как преобразовать путь к файлу в URL в ASP.NET - PullRequest
46 голосов
/ 19 августа 2008

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

Ответы [ 10 ]

15 голосов
/ 15 октября 2012

это то, что я использую:

private string MapURL(string path)
{
    string appPath = Server.MapPath("/").ToLower();
    return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
 }
13 голосов
/ 19 августа 2008

Насколько я знаю, нет способа сделать то, что вы хотите; по крайней мере, не напрямую. Я бы сохранил 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);
    }
}
11 голосов
/ 27 октября 2012

Проблема всех этих ответов в том, что они не учитывают виртуальные каталоги.

Рассмотрим:

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"

потому что нет способа получить полный список виртуальных каталогов.

8 голосов
/ 19 августа 2008

Я принял ответ Fredriks, так как он, похоже, решает проблему с наименьшим усилием, однако объект Request, похоже, не содержит метод ResolveUrl. Доступ к этому можно получить через объект Page или объект управления изображением:

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

Альтернативой, если вы используете статический класс, как я, является использование VirtualPathUtility:

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
3 голосов
/ 24 января 2012

Это сработало для меня:

HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
3 голосов
/ 19 августа 2008

Может быть, это не самый лучший способ, но он работает.

// 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-адресу сервера.

0 голосов
/ 19 ноября 2012

Для получения левой части URL:

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

Для получения названия приложения (web):

?HttpRuntime.AppDomainAppVirtualPath
"/"

С этим вы можете добавить свой относительный путь после получения полного URL.

0 голосов
/ 29 июля 2011

Кажется, что простое решение заключается во временном расположении на веб-сайте, к которому вы можете легко получить доступ с помощью URL, а затем вы можете перемещать файлы в физическое местоположение, когда вам необходимо их сохранить.

0 голосов
/ 19 августа 2008

Я думаю, что это должно работать. Это может быть на слэш. Не уверен, нужны ли они или нет.

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
0 голосов
/ 19 августа 2008

Насколько я знаю, нет ни одной функции, которая бы это делала (может быть, вы искали обратную сторону MapPath ?). Я хотел бы знать, существует ли такая функция. До этого я просто брал имя (имена), возвращаемое GetFiles, удалял путь и добавлял корень URL. Это может быть сделано в общем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...