.NET TIPS

[ASP.NET]データベースに登録したバイナリ・データを表示するには?

山田 祥寛
2005/01/28

 「TIPS:[ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには?」では、ExcelワークシートやPDF文書、画像ファイルのようなバイナリ・データをデータベース上に登録する方法について紹介した。本稿では、その続編として、このTIPSで登録したバイナリ・データをWebフォーム上から呼び出す方法について紹介する。

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

本稿で紹介するサンプル・プログラムの実行結果
DropDownListコントロールのプルダウン・メニューで指定されたファイルの中身を表示している。

 なお、本稿のサンプル・プログラムを利用するに当たっては、前掲のTIPSで紹介したimage_dataテーブルがデータベース上にあらかじめ用意されているものとする。

<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
SqlDataReader objRs;
void Page_Load(Object sender, EventArgs e) {
  if (!Page.IsPostBack) {
    SqlConnection objDb=new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
    // image_dataテーブルから取り出したファイル情報を
    // DropDownListコントロールにバインド
    SqlCommand objCom = new SqlCommand("SELECT id,title FROM image_data", objDb);
    objDb.Open();
    objRs = objCom.ExecuteReader();
    Page.DataBind();
    objDb.Close();
  }
}
void objBtn_Click(Object sender, EventArgs e) {
  SqlConnection objDb=new SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet");
  // ドキュメントIDをキーに
  // DropDownListコントロールで指定されたファイルを取得
  SqlCommand objCom = new SqlCommand("SELECT type,datum FROM image_data WHERE id=@id",objDb);
  objCom.Parameters.Add("@id", objDdp.SelectedItem.Value);
  objDb.Open();
  objRs = objCom.ExecuteReader();
  // データベースから取得したファイルを出力する。
  // typeフィールドの値をContentTypeプロパティにセットし、
  // datumフィールドの値をBinaryWriteメソッドで出力する。
  // それぞれ取得したフィールド値はキャストする必要がある。
  If (objRs.Read()) {
    Response.ContentType = (String)objRs[0];
    Response.BinaryWrite((Byte[])objRs[1]);
  }
  objDb.Close();
  // 出力の終了
  Response.End();
}
</script>
<html>
<head>
<title>バイナリデータの出力</title>
</head>
<body>
<form runat="Server">
出力データ:
<asp:DropDownList id="objDdp" runat="Server"
  DataSource="<%#objRs%>" DataTextField="title" DataValueField="id" />
<asp:Button id="objBtn" runat="Server"
  Text="出力" OnClick="objBtn_Click" />
</form>
</body>
</html>
データベースからバイナリ・データを取得し、表示する.aspxファイル(C#の場合)
 
<%@ Page Language="VB" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
Dim objRs As SqlDataReader
Sub Page_Load(sender As Object, e As EventArgs)
  If Not Page.IsPostBack Then
    Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
    ' image_dataテーブルから取り出したファイル情報を
    ' DropDownListコントロールにバインド
    Dim objCom As New SqlCommand("SELECT id,title FROM image_data",objDb)
    objDb.Open()
    objRs=objCom.ExecuteReader()
    Page.DataBind()
    objDb.Close()
  End If
End Sub
Sub objBtn_Click(sender As Object, e As EventArgs)
  Dim objDb As New SqlConnection("Data Source=(local);User ID=sa;Password=sa;Persist Security Info=True;Initial Catalog=dotnet")
  ' ドキュメントIDをキーに
  ' DropDownListコントロールで指定されたファイルを取得
  Dim objCom As New SqlCommand("SELECT type,datum FROM image_data WHERE id=@id",objDb)
  objCom.Parameters.Add("@id",objDdp.SelectedItem.Value)
  objDb.Open()
  Dim objRs=objCom.ExecuteReader()
  ' データベースから取得したファイルを出力する。
  ' typeフィールドの値をContentTypeプロパティにセットし、
  ' datumフィールドの値をBinaryWriteメソッドで出力する。
  ' それぞれ取得したフィールド値はCType関数で型変換する必要がある。
  If objRs.Read() Then
    Response.ContentType=CType(objRs.Item(0),String)
    Response.BinaryWrite(CType(objRs.Item(1),Byte()))
  End If
  objDb.Close()
  ' 出力の終了
  Response.End()
End Sub
</script>
<html>
<head>
<title>バイナリデータの出力</title>
</head>
<body>
<form runat="Server">
出力データ:
<asp:DropDownList id="objDdp" runat="Server"
  DataSource="<%#objRs%>" DataTextField="title" DataValueField="id" />
<asp:Button id="objBtn" runat="Server"
  Text="出力" OnClick="objBtn_Click" />
</form>
</body>
</html>
データベースからバイナリ・データを取得し、表示する.aspxファイル(VB.NETの場合)

 実装内容の詳細はコード内のコメントを参照いただくとして、ポイントとなるのは、以下の2点だ。

(1)クライアントに送信するバイナリ・データのコンテンツタイプを明示的に指定する

 クライアントへ送信されるバイナリ・データを、クライアント側がどのように処理するかは、そのデータのコンテンツタイプによって判断される。コンテンツタイプは、前掲のTIPSですでにデータベース上にセットされているので、ここではこれをHttpResponseクラス(System.Web名前空間)のContentTypeプロパティにセットすればよい。

(2)バイナリ・データを出力するには、BinaryWriteメソッドを使う

 HttpResponseクラスのBinaryWriteメソッドは、与えられたバイト・データを、デコード処理などは一切行わずにそのままの状態でクライアントへ出力するためのものだ。似たメソッドで、Writeメソッドがあるが、こちらはあくまで文字列を出力するためのメソッドであるので、混同しないように注意すること。

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

カテゴリ:Webフォーム 処理対象:データベース
使用ライブラリ:HttpResponseクラス(System.Web名前空間)
関連TIPS:[ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには?
[ASP.NET MVC]ASP.NET MVCでアップロードしたファイルをデータベースに登録するには?
[ASP.NET MVC]データベースから取り出したバイナリ・データを出力するには?
[ASP.NET]データベースの内容をクライアントにダウンロード提供するには?
[ASP.NET]Webフォームから動的にPDF文書を作成するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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 記事ランキング

本日 月間