10

我正在尝试创建一个应用程序来显示本地存储在网络服务器上的图像。这是我的观点,请注意“条目”是绝对地址,例如"C:\Images\Image1.jpg". 但是,当我运行它时,我会"Not allowed to load local resource: file:///C:/Images/ImageName.jpg"进入控制台日志。所以也许它会尝试访问客户端上的图像。如何告诉我的视图访问本地网络服务器路径而不是在客户端上查找图像源?请注意,将图像移动到项目目录不是一种选择,因为图像存储在网络服务器的不同驱动器上。

<!-- 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");

}

扔给用户的文件是这样的文件名“附件;文件名=TableImportLog.csv”,但我希望文件名为“TableErrorLog.csv”需要同样的帮助!

于 2015-03-26T05:08:10.460 回答