2012-09-25 7 views
10

Webサーバーにローカルに保存されている画像を表示するアプリケーションを作成しようとしています。私の見解では、「エントリー」は"C:\Images\Image1.jpg"のような絶対アドレスです。しかし、私がそれを実行すると、私は"Not allowed to load local resource: file:///C:/Images/ImageName.jpg"をコンソールログに取得します。だから、おそらくクライアント上の画像にアクセスしようとします。ローカルWebサーバーパスにアクセスし、クライアント上のイメージソースを検索しないように私のビューにどのように伝えますか?画像がプロジェクトディレクトリに移動することはオプションではないことに注意してください。画像はWebサーバー上の別のドライブに保存されているからです。srcプロパティをMVC3プロジェクトの外部にあるURLに設定します

<!-- language: c# --> 
@model List<String> 
<div style="height: 500px; overflow:scroll;"> 
<h2> 
    ScreenShots for testMachine</h2> 

@foreach (var entry in Model) 
{   
    <div class="nailthumb-container square-thumb"> 
    <img alt="screenshot" src="@Url.Content(entry)" /> 

</div> 
} 
</div> 

答えて

18

ASP.NET MVC 3アプリケーション以外のイメージをクライアントに直接配信することはできません。これは、クライアントがサーバー上の任意のファイルにアクセスできる場合、巨大なセキュリティ上の脆弱性となります。

コントローラアクションを作成し、返すコントローラアクションを作成し、<img>タグのsrcプロパティをこのコントローラアクションに指定する必要があります。

public class ImagesController: Controller 
{ 
    public ActionResult SomeImage() 
    { 
     return File(@"C:\Images\foo.jpg", "image/jpeg"); 
    } 
} 

とあなたのビュー内:

public class ImagesController: Controller 
{ 
    public ActionResult SomeImage(string imageName) 
    { 
     var root = @"C:\Images\"; 
     var path = Path.Combine(root, imageName); 
     path = Path.GetFullPath(path); 
     if (!path.StartsWith(root)) 
     { 
      // Ensure that we are serving file only inside the root folder 
      // and block requests outside like "../web.config" 
      throw new HttpException(403, "Forbidden"); 
     } 

     return File(path, "image/jpeg"); 
    } 
} 

とあなたのビューで:

<img src="@Url.Action("SomeImage", "Images", new { image = "foo.jpg" })" alt="" /> 

<img src="@Url.Action("SomeImage", "Images")" alt="" /> 

また、コントローラのアクションにパラメータとしてイメージ名を渡すことができます

+0

私はMVC3を非常に新しくしていますが、どうなっていますか? – Alicester4WonderlandPresident

+0

これは、FileResultを返すコントローラーアクションのように見えます。私の更新された答えを見てください。 –

+0

それは魅力のように働いた、ありがとう。 – Alicester4WonderlandPresident

0

上記のコードは私にとって役に立ちましたが、この

System.Web.UI.Page page = new System.Web.UI.Page(); 
string filePath = page.Server.MapPath("~/Log/" + fileName); 

     if (!filePath.StartsWith(filePath)) 

     { 

      throw new HttpException(403, "Forbidden"); 
     } 

     return File(filePath, "Content-Disposition", "attachment;filename=TableImportLog.csv"); 

}

のような変更をユーザーに投げられたファイルは、この「添付ファイル、ファイル名= TableImportLog.csv」のようなファイル名であるが、私はTableErrorLog.csv」としてファイル名を欲しいです" は同じことに助けが必要です!

関連する問題