.NET TIPS

[ASP.NET MVC]データベースから取り出したバイナリ・データを出力するには?[3.5、C#、VB]

山田 祥寛
2009/11/12

 「TIPS:[ASP.NET MVC]アップロードしたファイルをデータベースに登録するには?」では、クライアント上の任意のファイルをサーバ側のデータベースに登録する方法について、紹介した。

 本稿では、その続編として、同TIPSで登録した画像ファイルをアクション・メソッド経由で出力する方法について紹介する。

 次の画面は本稿で作成するサンプル・プログラムを実行した結果だ。

画像ファイルを選択して[送信]ボタンをクリック
選択ボックスで指定されたファイルの内容をダウンロード(画像ビューアが起動)

 なお、本稿のサンプルを利用するに当たっては、前掲のTIPSで紹介したPhotoテーブルをデータベースに用意し、かつ、テーブルがEntity Dataモデルに登録されている必要がある。

 次のコードは、データベースから画像ファイルを取得、ダウンロードするUpload/PhotoViewアクションのコードと、画像選択のためのビュー・スクリプトである。

// 画像選択のためのフォームを生成するUpload/PhotoViewアクション
public ActionResult PhotoView() {

  var _db = new MyMvcEntities();

  // Photoテーブルの内容を基にオプション・リストを用意
  ViewData["id"] = new SelectList(_db.Photo.ToList(), "id", "name");
  return View();
}

// 選択された画像を出力するUpload/PhotoViewアクション
// (HTTP POSTによる実行)
// idパラメータは選択ボックスで指定された画像コード
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult PhotoView(int id) {

  var _db = new MyMvcEntities();

  // idパラメータをキーにPhotoテーブルから対応する画像情報を取得
  var ph = (from p in _db.Photo
    where p.Id == id
    select p).FirstOrDefault(); // 先頭のPhotoオブジェクトを取得

  // Photoオブジェクトの内容に基づいて、
  // 画像データをクライアントに出力
  return File(ph.Data, ph.Mime, ph.Name);
}
' 画像選択のためのフォームを生成するUpload/PhotoViewアクション
Function PhotoView() As ActionResult

  Dim _db As New MyMvcEntities()

  ' Photoテーブルの内容を基にオプション・リストを用意
  ViewData("id") = New SelectList(_db.Photo.ToList(), "id", "name")
  Return View()
End Function

' 選択された画像を出力するUpload/PhotoViewアクション
' (HTTP POSTによる実行)
' idパラメータは選択ボックスで指定された画像コード
<AcceptVerbs(HttpVerbs.Post)> _
Function PhotoView(ByVal id As Integer) As ActionResult

  Dim _db As New MyMvcEntities()

  ' idパラメータをキーにPhotoテーブルから対応する画像情報を取得
  Dim ph = (From p In _db.Photo _
    Where p.Id = id _
    Select p).FirstOrDefault()  ' 先頭のPhotoオブジェクトを取得

  ' Photoオブジェクトの内容に基づいて、
  ' 画像データをクライアントに出力
  Return File(ph.Data, ph.Mime, ph.Name)
End Function
データベースから画像ファイルを取得&ダウンロードするUpload/PhotoViewアクション(上:UploadController.cs/下:UploadController.vb)

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>画像リスト</title>
</head>
<body>
  <div>
  <% using (Html.BeginForm()) {%>
    画像ファイル:
    <%--対応するビュー変数idを基に、選択ボックスを生成--%>
    <%=Html.DropDownList("id")%>
    <input type="submit" value="送信" />
  <% } %>
  </div>
</body>
</html>
<%@ Page Language="VB" Inherits="System.Web.Mvc.ViewPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
  <title>画像リスト</title>
</head>
<body>
  <div>
  <% Using (Html.BeginForm())%>
    画像ファイル:
    <%--対応するビュー変数idを基に、選択ボックスを生成--%>
    <%=Html.DropDownList("id")%>
    <input type="submit" value="送信" />
  <% End Using%>
  </div>
</body>
</html>
画像選択のためのビュー・スクリプト(Upload/PhotoView.aspx。上:C#、下:VB)

 コードの詳細はリスト内のコメントを参照していただくとして、ここでは以下の点に注目してほしい。

(1)バイナリ・データを出力するのは、Fileメソッドの役割

 アクション・メソッドからバイナリ・データを出力するには、ヘルパー・メソッドであるFileメソッドを使用する。Fileメソッドの構文は、以下のとおりである。

File(byte[] contents, String type [,String name])
[構文]Fileメソッド
contents:ダウンロードするデータ本体。
type:コンテンツ・タイプ。
name:ダウンロード時のファイル名。

 ここではLINQ to Entities経由で取り出した画像情報(Photoエンティティ)から、それぞれ該当するプロパティを読み込み、Fileメソッドに割り当てているわけだ。

 前述のTIPSでも解説したように、データベースでVARBINARY型として定義されたフィールドは、エンティティではバイト配列のプロパティとして割り当てられる。このため、LINQ to Entitiesで取得したVARBINARY型の値は、そのままFileメソッドの引数としてセットできる。

(2)選択ボックスを生成する方法

 もう1つ、ここではPhotoテーブルの内容を基に、動的に選択ボックスを生成している個所に注目してほしい。

 選択ボックスのオプション・リストを表すのは、SelectListクラス(System.Web.Mvc名前空間)の役割だ。

SelectList(IEnumerable items ,String value, String text [, Object selected])
[構文]SelectListコンストラクタ
items:選択オプション。
value:値を表すプロパティの名前。
text:テキストを表すプロパティの名前。
selected:デフォルトで選択された値。

 ここではPhotoテーブルからすべての画像情報を取得し、その画像コード(Idプロパティ)を選択ボックスの値として、ファイル名(Nameプロパティ)を表示テキストとして、それぞれ割り当てている。

 SelectListオブジェクトを用意できてしまえば、あとはこれをビュー変数にセットするだけだ。この際、ビュー変数のキー名は選択ボックスの名前と同名に設定しておく必要がある。

 これによって、ビュー・ヘルパーであるDropDownListメソッドは、ビュー変数から自動的に対応するSelectListオブジェクトを取り出し、選択ボックスを生成できるようになる。

 以上が理解できたら、さっそく、サンプル・プログラムを実行してみよう。冒頭のような実行結果が得られれば、サンプルは正しく動作している。End of Article

利用可能バージョン:.NET Framework 3.5
カテゴリ:Webフォーム 処理対象:ASP.NET MVC
関連TIPS:[ASP.NET MVC]アップロードしたファイルをデータベースに登録するには?

この記事と関連性の高い別の.NET TIPS
[ASP.NET MVC]ASP.NET MVCでアップロードしたファイルをデータベースに登録するには?
[ASP.NET AJAX]CascadingDropDownコントロールで階層式選択ボックスを生成するには?
[ASP.NET]データベースに登録したバイナリ・データを表示するには?
[ASP.NET]GridViewコントロールの表示データを特定条件で絞り込むには?
[ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間