基本上我有一些代码来检查特定目录以查看是否有图像,如果是,我想将图像的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;
}
}
答案 0 :(得分:15)
这就是我使用的:
private string MapURL(string path)
{
string appPath = Server.MapPath("/").ToLower();
return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
}
答案 1 :(得分:13)
据我所知,没有办法做你想做的事;至少不是直接的。我将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);
}
}
答案 2 :(得分:11)
所有这些答案的问题在于它们不考虑虚拟目录。
考虑:
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"
因为无法获得完整的虚拟目录列表。
答案 3 :(得分:8)
我已经接受了Fredriks的答案,因为它似乎以最少的努力解决了问题,但是Request对象似乎没有使用ResolveUrl方法。 这可以通过Page对象或Image控件对象访问:
myImage.ImageUrl = Page.ResolveUrl(photoURL);
myImage.ImageUrl = myImage.ResolveUrl(photoURL);
另一种方法是,如果你像我一样使用静态类,那就是使用VirtualPathUtility:
myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
答案 4 :(得分:3)
也许这不是最好的方式,但它有效。
// 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 \ whatever.com \ whatever)和页面名称(如/Whatever.aspx)。图像的物理路径应该包含服务器的路径,因此“减去”它们,只留下图像相对于服务器的路径(如:\ design \ picture.jpg)。用斜杠替换反斜杠并将其附加到服务器的URL。
答案 5 :(得分:3)
这对我有用:
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
答案 6 :(得分:0)
据我所知,没有单一的功能可以做到这一点(也许你正在寻找MapPath的倒数?)。我很想知道这种功能是否存在。在那之前,我只需要获取GetFiles返回的文件名,删除路径,然后添加URL根目录。这可以一般地完成。
答案 7 :(得分:0)
简单的解决方案似乎是在网站中有一个临时位置,您可以使用URL轻松访问该位置,然后您可以在需要保存文件时将文件移动到物理位置。
答案 8 :(得分:0)
获取网址的左侧部分:
?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
"http://localhost:1714"
获取应用程序(网络)名称:
?HttpRuntime.AppDomainAppVirtualPath
"/"
有了这个,您可以在获得完整的URL之后添加相对路径。
答案 9 :(得分:-2)
我认为这应该有效。它可能是在斜线上。不确定是否需要它们。
string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];