データベースにある画像データを表示する方法
v サンプル コードのダウンロード (aspnettips_DataBaseImage2.msi, 267 KB)
※このサンプルをお使いいただくためには、Visual Studio 2005 が必要です。
サーバーへ画像をアップロードする方法については、画像をデータベースにアップロードする方法で紹介しました。ここで紹介したサンプルは、データベースに画像データをアップロードするのみでしたが、データベースにアップロードした画像データを表示するには、どのようにすれば良いでしょうか。そこで、今回は、データベースにある画像データを表示する方法を紹介します。
データベースを準備する
画像をデータベースにアップロードする方法で紹介したサンプルを使って、図1 にある 3 種類の画像を登録した Microsoft Office Acess の MDB ファイルを用意します(図2)。
図 1. データベースへ登録する画像ファイル
図 2. IMAGE.mdb の IMGINFO テーブル
データベースにある画像データを出力するページを作成する
はじめに、データベースにある画像データを取得し、出力するページを作成します(OutputDBImage.aspx)。このページはデータを出力するのみなので、リスト2 のように Page プロパティの設定のみにします。
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="OutputDBImage.aspx.vb" Inherits="OutputDBImage" %> |
リスト1.OutputDBImage.aspx
次に、ページの Load イベントをハンドリングし、データベースから画像データを読み込み、出力するコードを実装します(リスト3)。今回のサンプルでは、取得する画像データは、HTTP クエリ文字列で指定された ID によって抽出し、OleDbDataReader を使ってデータを読み込みます。
画像データを出力するには、出力する画像データの HTTP MIME タイプを指定し、画像データをバイナリ データとして出力する必要があります。
HTTP MIME タイプを指定するには、HttpResponse の ContentType プロパティにデータベース テーブルの IMGTYPE フィールドに登録されている HTTP MIME タイプを指定します。画像データをバイナリ データとして出力するには、HttpResponse の BinaryWrite メソッドを使い、データベース テーブルの IMGDATA フィールドに登録されている画像データを出力します。
Partial Class OutputDBImage Inherits System.Web.UI.Page Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' ID 取得 Dim intId As Integer = 0 Integer.TryParse(Request.QueryString("id"), intId) ' DB を開く Dim oleConn As New Data.OleDb.OleDbConnection() oleConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + _ AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "IMAGE.MDB" oleConn.Open() ' データの読込み Dim cmdSelect As New Data.OleDb.OleDbCommand cmdSelect.Connection = oleConn cmdSelect.CommandText = "SELECT * FROM IMGINFO WHERE ID=?" cmdSelect.Parameters.Add("ID", Data.OleDb.OleDbType.Integer, 4, "ID").Value = intId Dim rdrDB As Data.OleDb.OleDbDataReader = cmdSelect.ExecuteReader() If rdrDB.Read() Then Response.ContentType = rdrDB("IMGTYPE") Response.Flush() Response.BinaryWrite(CType(rdrDB("IMGDATA"), Byte())) Response.End() End If cmdSelect.Dispose() ' DB を閉じる oleConn.Close() oleConn.Dispose() End Sub End Class |
リスト2.OutputDBImage.aspx.vb に追加するコード
出力結果を表示するページを作成する
OutputDBImage.aspx が出力する画像データを表示するには、Image コントロールを使用します。OutputDBImage.aspx に渡す ID は、データベースから列挙してきたものを ListBox コントロールに表示して指定することにします(リスト3、およびリスト4)。
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %> |
リスト3.Default.aspx
図 3 Default.aspx のデザイナ画面
Partial Class _Default Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If ListBox1.Items.Count < 1 Then ' DB を開く Dim oleConn As New Data.OleDb.OleDbConnection() oleConn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + _ AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "IMAGE.MDB" oleConn.Open() ' データの読込み Dim cmdSelect As New Data.OleDb.OleDbCommand cmdSelect.Connection = oleConn cmdSelect.CommandText = "SELECT * FROM IMGINFO" Dim rdrDB As Data.OleDb.OleDbDataReader = cmdSelect.ExecuteReader() ListBox1.DataSource = rdrDB ListBox1.DataTextField = "NAME" ListBox1.DataValueField = "ID" ListBox1.DataBind() cmdSelect.Dispose() ' DB を閉じる oleConn.Close() oleConn.Dispose() End If End Sub Protected Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged Image1.ImageUrl = "~/OutputDBImage.aspx?id=" + Request("ListBox1") End Sub End Class |
リスト4.Default.aspx.vb
図 4. Default.aspx の実行結果