在视图中设置src属性到MVC3项目之外的URL

时间:2012-09-25 19:27:42

标签: c# asp.net-mvc-3

我正在尝试创建一个应用程序,它将显示本地存储在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>

2 个答案:

答案 0 :(得分: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="" />

答案 1 :(得分: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” 需要帮助!