2008-08-19 11 views
42

基本的には、画像があるかどうかを確認するための特定のディレクトリを確認するコードと、ImageControlのURLを画像に割り当てたい場合があります。ファイルパスをASP.NETのURLに変換するにはどうすればいいですか?

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

答えて

13

私が知る限り、あなたが望むことをする方法はありません。少なくとも直接的ではない。私はアプリケーションに相対的なパスとしてphotosLocationを保存します。たとえば、"~/Images/"です。このように、あなたは(System.IO.Pathからの助けのビットで)URLを取得するには物理的な位置、およびResolveUrlを取得するためにMapPathのを使用することができます。

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

.Net版のドキュメントでは、HttpRequestのResolveUrlメンバーが見つかりません。 ASP.Net MVCを使用していますか? – Jared

+12

@Fredrik Jaredは、HttpRequestオブジェクトにはこのメソッドがないことを指摘しています。これは、PageオブジェクトまたはWebコントロールオブジェクトにあります。これを反映するためにあなたの答えを編集できますか? –

+7

'ResolveUrl'は' System.Web.HttpRequest'のメンバーではありません – adripanico

0

私が知っている限り、これを行う機能はありません(おそらくMapPathの逆数を探していましたか?)。私はそのような機能が存在するかどうかを知りたいです。それまでは、GetFilesから返されたファイル名を取得し、パスを削除してURLルートの先頭に追加します。これは一般的に行うことができます。

-2

これはうまくいくと思います。スラッシュで消えている可能性があります。彼らが必要かどうかわからない。

string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0]; 
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など)の2つの部分に分割します。イメージの物理パスにはサーバーのパスが含まれている必要があります。つまり、それらを「差し引いて」、サーバーの相対パスのみを残します(\ design \ picture.jpgなど)。バックスラッシュをスラッシュに置き換え、サーバーのURLに追加します。

8

しかし、Requestオブジェクトは、ResolveUrlメソッドをconatinとは思われない最小限の労力で問題を解決するために見えるように私はFredriksの答えを受け入れてきました。 これは、PageオブジェクトまたはImageコントロールオブジェクトを介してアクセスすることができます。私はとあなたが静的クラスを使用している場合

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

代替、VirtualPathUtilityを使用することです:

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

簡単な解決策は、URLで簡単にアクセスできる一時的な場所をWebサイト内に置くことで、ファイルを保存する必要があるときにファイルを物理的な場所に移動することができます。

1

これは私の仕事:

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

をこれは私が使用するものです。

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

ありがとうございます、これはおかげで 'Server'の拡張メソッド - ' public static string MapUrl(this HttpServerUtilityBase Server、string path) ' – B2K

10

これらすべての答えと問題は、彼らが考慮に仮想ディレクトリを取らないということです。

は考えてみましょう:

だから、
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" 

完全なリストを取得する方法がないので、仮想ディレクトリの。 URLの左部分を取得するために

0

:アプリケーション(ウェブ)名を取得するために

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

:これにより

?HttpRuntime.AppDomainAppVirtualPath 
"/" 

を、あなたはそれを取得した後、あなたの相対パスを追加することが可能です完全なURL

関連する問題