我正在尝试创建一个应用程序,它将显示本地存储在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>
答案 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” 需要帮助!