Сведения о вопросе

Kimsanov

04:18, 21st August, 2020

Теги

asp.net   url   image    

Как конвертировать путь к файлу в формат URL в ASP.NET

Просмотров: 554   Ответов: 10

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



  Сведения об ответе

lesha

18:50, 11th August, 2020

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

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


  Сведения об ответе

JUST___

22:12, 23rd August, 2020

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


  Сведения об ответе

dumai

23:48, 5th August, 2020

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

Считать:

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"

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


  Сведения об ответе

VERSUION

16:48, 29th August, 2020

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

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

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

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);


  Сведения об ответе

JUST___

08:23, 3rd August, 2020

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

// 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;

Edit: хорошо, кто-то помечен как не полезный. Некоторое объяснение: возьмите физический путь текущей страницы, разделите его на две части: сервер и каталог (например, c:\inetpub\whatever.com\whatever) и имя страницы (например, /Whatever.aspx). физический путь изображения должен содержать путь сервера, поэтому "substract" их, оставляя только путь изображения относительно сервера (например: \design\picture.jpg). Замените обратную косую черту косой чертой и добавьте ее к url сервера.


  Сведения об ответе

VCe znayu

20:40, 7th August, 2020

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

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


  Сведения об ответе

lourence

02:16, 5th August, 2020

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


  Сведения об ответе

LAST

06:19, 4th August, 2020

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


  Сведения об ответе

nYU

10:07, 5th August, 2020

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

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

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

?HttpRuntime.AppDomainAppVirtualPath
"/"

При этом вы можете добавить свой относительный путь после того, как получите полный URL.


  Сведения об ответе

VERSUION

11:04, 21st August, 2020

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

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться