10

Web サーバーにローカルに保存されている画像を表示するアプリケーションを作成しようとしています。これが私の見解です。「エントリ」はのような絶対アドレスであることに注意してください"C:\Images\Image1.jpg"。ただし、実行すると"Not allowed to load local resource: file:///C:/Images/ImageName.jpg"、コンソール ログに記録されます。そのため、クライアント上のイメージにアクセスしようとする可能性があります。クライアントで画像ソースを探すのではなく、ローカル Web サーバー パスにアクセスするようビューに指示するにはどうすればよいですか? 画像は Web サーバーの別のドライブに保存されているため、画像をプロジェクト ディレクトリに移動することはできません。

<!-- 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>
4

2 に答える 2

18

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

それらを返すコントローラー アクションを記述し、タグのsrcプロパティをこのコントローラー アクションにポイントする必要があります。<img>

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

そしてあなたのビューの中で:

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

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

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="" />
于 2012-09-25T19:30:40.640 に答える
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");

}

ユーザーにスローされるファイルは、この「attachment;filename=TableImportLog.csv」のようなファイル名ですが、「TableErrorLog.csv」というファイル名が必要です。

于 2015-03-26T05:08:10.460 に答える