ASP.NET でファイル パスを URL に変換するにはどうすればよいですか
質問
基本的に、特定のディレクトリをチェックして画像が存在するかどうかを確認し、存在する場合は画像の 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;
}
}
解決
私の知る限り、あなたが望むことを実現する方法はありません。少なくとも直接的には。私なら保管します 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);
}
}
他のヒント
これは私が使っているものです:
private string MapURL(string path)
{
string appPath = Server.MapPath("/").ToLower();
return string.Format("/{0}", path.ToLower().Replace(appPath, "").Replace(@"\", "/"));
}
これらすべての回答の問題は、仮想ディレクトリが考慮されていないことです。
考慮する:
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"
仮想ディレクトリの完全なリストを取得する方法がないためです。
最小限の労力で問題を解決できるように見えるため、Fredriksの回答を受け入れましたが、RequestオブジェクトにはResolveUrlメソッドが含まれていないようです。これには、Page オブジェクトまたは Image コントロール オブジェクトを通じてアクセスできます。
myImage.ImageUrl = Page.ResolveUrl(photoURL);
myImage.ImageUrl = myImage.ResolveUrl(photoURL);
私と同じように静的クラスを使用している場合は、VirtualPathUtility を使用するという方法もあります。
myImage.ImageUrl = VirtualPathUtility.ToAbsolute(photoURL);
これは最良の方法ではないかもしれませんが、うまくいきます。
// 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;
編集:OK、役に立たないとマークされた人がいます。いくつかの説明:現在のページの物理パスを取得し、それを 2 つの部分に分割します。サーバーとディレクトリ (c:\inetpub\whatever.com\whatever など) およびページ名 (/Whatever.aspx など)。イメージの物理パスにはサーバーのパスが含まれている必要があるため、それらを「減算」して、サーバーに対する相対的なイメージのパスのみを残します (次のように)。\デザイン\絵.jpg)。バックスラッシュをスラッシュに置き換えて、サーバーの URL に追加します。
これは私にとってはうまくいきました:
HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority) + HttpRuntime.AppDomainAppVirtualPath + "ImageName";
私の知る限り、これを行う関数は 1 つもありません (おそらく、次の関数の逆を探していたのかもしれません) マップパス?)。そのような機能があるかどうか知りたいです。それまでは、GetFiles によって返されたファイル名を取得し、パスを削除し、URL ルートを先頭に追加するだけでした。これは一般的に行うことができます。
簡単な解決策は、Web サイト内に URL で簡単にアクセスできる一時的な場所を用意し、ファイルを保存する必要があるときにファイルを物理的な場所に移動することのようです。
URL の左側の部分を取得するには:
?HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority)
"http://localhost:1714"
アプリケーション (Web) 名を取得するには:
?HttpRuntime.AppDomainAppVirtualPath
"/"
これにより、完全な URL を取得した後に相対パスを追加できるようになります。
これはうまくいくはずだと思います。スラッシュがオフになっている可能性があります。それらが必要かどうかはわかりません。
string url = Request.ApplicationPath + "/" + photosLocation + "/" + files[0];