Как преобразовать путь к файлу в 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;
    }
}
19.08.2008 11:24:55
10 ОТВЕТОВ
РЕШЕНИЕ

Насколько я знаю, нет способа сделать то, что вы хотите; по крайней мере, не напрямую. Я бы сохранил 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);
    }
}
14
20.01.2016 05:39:05
Я не могу найти ResolveUrl члена HttpRequest в документации для любой из версий .Net. Вы используете ASP.Net MVC?
Jared 28.12.2009 18:13:54
@Fredrik Как отметил Джаред, у объекта HttpRequest нет этого метода. Его можно найти в объекте Page или в веб-элементе управления. Не могли бы вы отредактировать свой ответ, чтобы отразить это?
Andy Rose 23.02.2010 15:56:05

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

0
19.08.2008 11:53:30

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

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
-2
25.08.2013 20:25:03

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

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

3
19.08.2008 12:25:38

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

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

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

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
9
19.08.2008 13:51:26

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

0
29.07.2011 11:40:10

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

HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
3
24.01.2012 11:10:00
Отличный ответ! должен иметь больше голосов за. Более подробно, вам нужен переключатель для работы с AppDomainAppVirtualPath, потому что, если веб-сайт находится в корневом каталоге, VirtualPath будет пустой строкой, поэтому перед именем файла не должно быть косой черты, если заполнен VirtualPath, необходимо добавить дополнительная косая черта. string sVPath = HttpRuntime.AppDomainAppVirtualPath; if (sVPath.Length > 0) sVPath += "/"; string sCSSURL = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + sVPath + "myImage.jpg";
mike 5.03.2019 06:12:52

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

private string MapURL(string path)
{
    string appPath = Server.MapPath("/").ToLower();
    return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
 }
16
15.10.2012 14:17:50
Спасибо за это, вот это как метод расширения на Server-public static string MapUrl(this HttpServerUtilityBase Server, string path)
B2K 28.02.2017 17:14:20
Кажется, что это правильный ответ и чище! PLZ Upvote
KADEM Mohammed 3.06.2018 03:39:25

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

Рассматривать:

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"

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

11
5.06.2013 14:15:52
Есть проблема безопасности. В общем, одно веб-приложение не должно иметь возможности что-либо делать с сервером за пределами своего собственного веб-корня. Если это действительно то, что вам нужно, вы можете сделать это, запросив метабазу IIS, что-то вроде этого: stackoverflow.com/questions/4710187/… . Но ваше веб-приложение должно работать с опасно высокими привилегиями. Если двум веб-приложениям необходимо обмениваться файлами, лучше внедрить для них сервисы.
Concrete Gannet 1.06.2018 00:37:53
Возможно, отображение может быть не уникальным. Два виртуальных каталога могут быть сопоставлены одной и той же папке NTFS.
Ross Presser 31.10.2019 18:10:04

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

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

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

?HttpRuntime.AppDomainAppVirtualPath
"/"

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

0
19.11.2012 11:12:07