从文件系统中查看图像

Gio*_*zas 4 c# asp.net-mvc-4

我有一个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));
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用上面这样的帮助:

@Html.UploadedImage(item.StoreItemImage)
Run Code Online (Sandbox Code Playgroud)

这个item.StoreItemImage从数据库中带来了图像的绝对路径(比方说D:\ appName\UserFolder\image.jpg).这个助手终于呈现出来了

<img src="D:\appName\UserFolder\image.jpg" />
Run Code Online (Sandbox Code Playgroud)

图像不会显示在浏览器中.此外,它不是一种优雅而安全的方式来显示应用程序存储图像的实际服务器路径.有解决方案吗?谢谢.

因此,根据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");
    }
Run Code Online (Sandbox Code Playgroud)

Cᴏʀ*_*ᴏʀʏ 6

假设您有某种与数据库中每个图像相关的键或ID,您可以通过操作(仅使用数据库ID引用它)来"隐藏"图像源:

public ActionResult GetImage(int dbId)
{
    byte[] image = LoadImageFromDatabase(dbId);
    return File(image, "image/jpeg");
}
Run Code Online (Sandbox Code Playgroud)

并在您的视图中使用此标记:

<img src="@Url.Action("GetImage", new { dbId = Model.PhotoDatabaseId })" />
Run Code Online (Sandbox Code Playgroud)