4

サーバーの C:\inetpub\wwwroot\appName ディレクトリにある ASP.NET MVC 4 Web アプリケーションがあります。ユーザーがアップロードした画像を 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");
    }
4

1 に答える 1

6

データベース内の各画像に関連する何らかのキーまたは 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 })" />
于 2013-06-18T18:30:01.663 に答える