47

基本上我有一些代码来检查特定目录以查看图像是否存在,如果存在,我想将图像的 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;
    }
}
4

10 回答 10

16

这就是我使用的:

private string MapURL(string path)
{
    string appPath = Server.MapPath("/").ToLower();
    return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
 }
于 2012-10-15T14:17:50.990 回答
14

据我所知,没有办法做你想做的事;至少不是直接的。我会将其存储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);
    }
}
于 2008-08-19T12:02:18.700 回答
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"

因为没有办法获得完整的虚拟目录列表。

于 2012-10-27T15:00:39.440 回答
9

我接受了 Fredriks 的回答,因为它似乎以最少的努力解决了问题,但是 Request 对象似乎并没有包含 ResolveUrl 方法。这可以通过 Page 对象或 Image 控件对象来访问:

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

如果您像我一样使用静态类,另一种方法是使用 VirtualPathUtility:

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
于 2008-08-19T13:51:26.593 回答
4

这对我有用:

HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
于 2012-01-24T11:07:18.993 回答
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。

于 2008-08-19T12:03:22.457 回答
0

据我所知,没有一个函数可以做到这一点(也许你正在寻找MapPath的倒数?)。我很想知道这样的功能是否存在。在那之前,我只会获取 GetFiles 返回的文件名,删除路径,然后添加 URL 根目录。这可以通用地完成。

于 2008-08-19T11:53:30.247 回答
0

简单的解决方案似乎是在网站中有一个临时位置,您可以使用 URL 轻松访问该位置,然后您可以在需要保存文件时将文件移动到物理位置。

于 2011-07-29T11:40:10.277 回答
0

要获取 URL 的左侧部分:

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

获取应用程序(网络)名称:

?HttpRuntime.AppDomainAppVirtualPath
"/"

有了这个,您可以在获取完整 URL 之后添加您的相对路径。

于 2012-11-19T11:12:07.640 回答
-2

我认为这应该有效。它可能在斜线处关闭。不确定它们是否需要。

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];
于 2008-08-19T11:55:37.997 回答