我有一个ASP.NET MVC 4 Web应用程序,它位于服务器上的C:\ inetpub \ wwwroot \ appName目录中。我想将用户上传的图像存储在D:\ appName \ UserFolder \目录中,然后在剃刀视图中显示这些图像。我创建了以下html帮助器:
public static class MyHtmlHelpers
{
public static IHtmlString UploadedImage(this HtmlHelper htmlHelper, string url)
{
var urlHelper = new UrlHelper(htmlHelper.ViewContext.RequestContext);
var image = new TagBuilder("img");
image.Attributes["src"] = UrlHelper.GenerateContentUrl(url, htmlHelper.ViewContext.HttpContext);
return MvcHtmlString.Create(image.ToString(TagRenderMode.SelfClosing));
}
}
我使用上面的帮助:
@Html.UploadedImage(item.StoreItemImage)
这个 item.StoreItemImage 从数据库中获取图像的绝对路径(比方说D:\ appName \ UserFolder \ image.jpg)。这个帮助器最终像这样呈现
<img src="D:\appName\UserFolder\image.jpg" />
图像不会显示在浏览器中。此外,它不是一种优雅而安全的方式来显示应用程序存储图像的实际服务器路径。有解决方案吗?谢谢。
解
因此,根据Cory的建议,我只是根据记录发布了适合我的解决方案。对于我创建以下操作方法的其他人可能会有所帮助:
public FileResult GetImage(string fileLocation)
{
Image image = Image.FromFile(fileLocation);
byte[] imageArray;
using (var memoryStream = new MemoryStream())
{
image.Save(memoryStream, ImageFormat.Jpeg);
imageArray = memoryStream.ToArray();
}
return File(imageArray, "image/jpeg");
}
答案 0 :(得分:5)
假设您有某种与数据库中每个图像相关的键或ID,您可以通过操作(仅使用数据库ID引用它)来“隐藏”图像源:
public ActionResult GetImage(int dbId)
{
byte[] image = LoadImageFromDatabase(dbId);
return File(image, "image/jpeg");
}
在您的视图中使用此标记:
<img src="@Url.Action("GetImage", new { dbId = Model.PhotoDatabaseId })" />