web-dev-qa-db-ja.com

ASP.NetMVC3でbyte []に​​含まれる画像を表示する

強いタイプのビューがあります。この強い型にはbyte []で構成されるフィールドがあり、この配列には画像が含まれています。

この画像を@ Html.Image(Model.myImage)のようなもので表示することは可能ですか?

どうもありがとうございました

20
J4N

画像をFileContentResultとして返すコントローラーアクションメソッドを作成できます。

public FileContentResult Display(string id) {
   byte[] byteArray = GetImageFromDB(id);
   return new FileContentResult(byteArray, "image/jpeg");
}

次に、モデルの画像IDを使用して、ビュー内のアクションメソッドへのActionLinkを作成できます。

17
Dmitry S.

画像の大きさによります。小さい場合は、base-64でエンコードして、htmlに埋め込むことができます これらのいずれかのように

ここからの具体例

_<img src="data:image/gif;base64,R0lGODlhUAAPAKIAAAsLav///88PD9WqsYmApmZmZtZfYmdakyH5BAQUAP8ALAAAAABQAA8AAAPbWLrc/jDKSVe4OOvNu/9gqARDSRBHegyGMahqO4R0bQcjIQ8E4BMCQc930JluyGRmdAAcdiigMLVrApTYWy5FKM1IQe+Mp+L4rphz+qIOBAUYeCY4p2tGrJZeH9y79mZsawFoaIRxF3JyiYxuHiMGb5KTkpFvZj4ZbYeCiXaOiKBwnxh4fnt9e3ktgZyHhrChinONs3cFAShFF2JhvCZlG5uchYNun5eedRxMAF15XEFRXgZWWdciuM8GCmdSQ84lLQfY5R14wDB5Lyon4ubwS7jx9NcV9/j5+g4JADs=" alt="British Blog Directory" width="80" height="15">
_

画像のサイズがかなり大きい場合は、代わりに、画像へのキーを介してルックアップできるルート、つまり_/images/{id}_のようなルートを作成することをお勧めします。そのルートでは、画像のバイナリをフェッチして使用します return File(bytes, contentType) 、さらにキャッシュヘッダーを設定します(必要なセキュリティを再確認することを忘れないでください)。あなたのhtmlであなたはただ持っているでしょう

_<img src="/images/@imageId" ... />
_

(かみそりの構文を使用しますが、aspxについても同様です)。

個別ルートアプローチでは、サーバーへの追加のホップが必要ですが、クライアントでのキャッシュが可能です(インラインbase-64アプローチでは、すべてのリクエストにデータが配置されます)。

8
Marc Gravell

すでに画像が_byte[]_配列としてモデルにロードされている場合は、@ Marc Gravellが 彼の答え: で述べているようにこれを行うことができます。

_<img src="data:image;base64,@System.Convert.ToBase64String(Model.Photo)" />
_

これにより、プロセス全体が大幅に簡素化され、特定のFileContentResultアクションメソッドを用意してデータベースに再度アクセスする必要はありません(@Dmitry Sの answer を参照)。_byte[]_すでにモデルにロードされているため、画像/写真を含む配列。

7

(データベースから?)バイト配列を取得し、 File メソッドを介して画像を返す新しいアクションが必要なようです..。

次に、そのアクションを指すアンカーを生成します。これにより、ページの読み込み中に画像を読み込むことができ、表示が高速化されます。

4
Kieron
1
Elan Hasson

画像を提供するための単純な汎用ハンドラーを設計します。このハンドラーは、いくつかのパラメーターを指定すると、データベースから画像をロードし、それらをhttp出力ストリームに書き込むことができます。

public class UserImage : IHttpHandler
{
    public bool IsReusable
    {
        get { return false; }
    }

    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/jpeg";

        // Get the stream from the database
        var image = System.Drawing.Image.FromStream(stream);

        image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
    }
}
0
DEHAAS