2008-08-19 41 views
42

Về cơ bản tôi có một số mã để kiểm tra một thư mục cụ thể để xem hình ảnh có ở đó không và nếu vậy tôi muốn gán URL cho hình ảnh cho ImageControl.Làm thế nào để chuyển đổi đường dẫn tệp thành URL trong ASP.NET

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

Trả lời

13

Theo như tôi biết, không có phương pháp để làm những gì bạn muốn; ít nhất là không trực tiếp. Tôi lưu trữ photosLocation như một đường dẫn liên quan đến ứng dụng; ví dụ: "~/Images/". Bằng cách này, bạn có thể sử dụng MapPath để có được những vị trí địa lý, và ResolveUrl để có được URL (với một chút giúp đỡ từ 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); 
    } 
} 
+8

Tôi không thể tìm thấy thành viên ResolveUrl của HttpRequest trong tài liệu cho bất kỳ phiên bản .Net nào. Bạn đang sử dụng ASP.Net MVC? – Jared

+12

@Fredrik Như Jared đã chỉ ra đối tượng HttpRequest không có phương thức này. Nó có thể được tìm thấy trong đối tượng Page hoặc đối tượng điều khiển web. Bạn có thể chỉnh sửa câu trả lời của mình để phản ánh điều này không? –

+7

'ResolveUrl' không phải là thành viên của' System.Web.HttpRequest' – adripanico

0

Cho đến khi tôi biết không có chức năng nào thực hiện điều này (có thể bạn đang tìm kiếm nghịch đảo của MapPath?). Tôi rất muốn biết nếu một chức năng như vậy tồn tại. Cho đến lúc đó, tôi sẽ chỉ lấy (các) tên tệp được GetFiles trả về, xóa đường dẫn và thêm vào gốc URL. Điều này có thể được thực hiện một cách tổng quát.

-2

Tôi nghĩ điều này sẽ hiệu quả. Nó có thể được tắt trên các dấu gạch chéo. Bạn không chắc chắn liệu chúng có cần thiết hay không.

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

Có lẽ đây không phải là cách tốt nhất, nhưng nó hoạt động.

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

Chỉnh sửa: Ok, ai đó được đánh dấu là không hữu ích. Một số giải thích: lấy đường dẫn vật lý của trang hiện tại, chia thành hai phần: máy chủ và thư mục (như c: \ inetpub \ whatever.com \ whatever) và tên trang (như /Whatever.aspx). Đường dẫn vật lý của hình ảnh nên chứa đường dẫn của máy chủ, vì vậy "trừ" chúng, chỉ để lại đường dẫn của hình ảnh tương ứng với đường dẫn của máy chủ (như: \ design \ picture.jpg). Thay thế các dấu gạch chéo ngược bằng dấu gạch chéo và nối nó vào url của máy chủ.

8

Tôi đã chấp nhận câu trả lời của Fredriks vì nó dường như giải quyết vấn đề với ít nỗ lực nhất, tuy nhiên đối tượng Yêu cầu không xuất hiện để kết hợp phương pháp ResolveUrl. này có thể được truy cập thông qua trang đối tượng hoặc một đối tượng kiểm soát hình ảnh:

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

Một thay thế, nếu bạn đang sử dụng một lớp tĩnh như tôi, là sử dụng VirtualPathUtility:

myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL); 
0

Các giải pháp đơn giản dường như có vị trí tạm thời trong trang web mà bạn có thể truy cập dễ dàng bằng URL và sau đó bạn có thể di chuyển tệp đến vị trí thực tế khi bạn cần lưu chúng.

1

này đã làm việc cho tôi:

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

đây là những gì tôi sử dụng:

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

Cảm ơn vì điều này, đây là phương thức mở rộng trên 'Server' -' public static string MapUrl (máy chủ HttpServerUtilityBase, đường dẫn chuỗi) ' – B2K

10

Vấn đề với tất cả những câu trả lời là họ không dùng thư mục ảo vào tài khoản.

xem xét:

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 

Vì vậy:

Server.MapPath("~/files/vip/readme.txt") 
    = "c:\data\VIPcust\files\readme.txt" 

Nhưng có không cách để làm điều này:

MagicResolve("c:\data\VIPcust\files\readme.txt") 
    = "http://tempuri.com/files/vip/readme.txt" 

vì không có cách nào để có được một danh sách đầy đủ các thư mục ảo.

0

Đối với có được một phần bên trái của URL:

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

Đối với lấy tên ứng dụng (web):

?HttpRuntime.AppDomainAppVirtualPath 
"/" 

Với điều này, bạn có sẵn để thêm đường dẫn tương đối của bạn sau đó lấy URL hoàn chỉnh.

Các vấn đề liên quan