.NET TIPS

[ASP.NET]バイナリ・データをアップロードしてデータベースに登録するには?

山田 祥寛
2005/01/21

 文字列や数値のような単純なテキスト・データだけでなく、Excelワークシート、Word文書、PDF文書などのバイナリ・データをデータベース・サーバで管理したいというケースは意外と多い。業務フローの主体が次第にWebシステムに重心を移してきたとはいっても、表現力に富んだOffice製品を業務で利用する機会が減ってきたわけではないし、手元で作成したドキュメントをWeb上でそのまま交換したいというケースは多くあるからだ。

 もちろん、そうした場合にも、必ずしもデータベースを持ち出さなければならないというわけではない。サーバ上の特定の場所にファイル・アップロード用のスペースを用意し、ファイル・システム上でデータを管理するという選択肢ももちろんある。しかし、この方法では適切にアクセス権限を設定しないと、不特定多数のユーザーにアップロードしたファイルが見えてしまうという欠点がある。特にワークフロー上で交換するファイルは、ユーザーごとの細かなアクセス制御が必要となることが多く、ファイル・システム上で制御するには何かと設定が面倒だ。

 そのような場合には、バイナリ・データをデータベース上で管理することを検討するとよい。いまさらいうまでもなく、データベースならば、ファイル・システム上にそのままファイルを配置するよりも安全であるし、アクセス権限も制御しやすい。

 そこで本稿では、ブラウザ上からアップロードしたファイルをデータベースに登録する方法について紹介することにしよう。本稿のサンプルを利用するに際しては、あらかじめデータベースに以下のようなimage_dataテーブルを作成しておく必要がある。

フィールド名 データ型 概要
id INT ドキュメントID(主キー/連番)
title VARCHAR(100) ファイル名
type VARCHAR(50) MIMEタイプ
datum IMAGE バイナリ・データ
image_dataテーブルのフィールド・レイアウト

 それでは、具体的なコードを眺めてみよう。

<%@ Page ContentType="text/html" Language="C#" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
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");
  SqlCommand objCom=new SqlCommand("INSERT INTO image_data(title,type,datum) VALUES(@title,@type,@datum)",objDb);
  // title、typeフィールドには、それぞれアップロード・ファイルの
  // ファイル名、コンテンツ・タイプをセットする
  objCom.Parameters.Add("@title", Path.GetFileName(datum.PostedFile.FileName));
  objCom.Parameters.Add("@type", datum.PostedFile.ContentType);
  // アップロード・ファイルを入力ストリーム経由でbyte配列に読み込む
  Byte[] aryData = new Byte[datum.PostedFile.ContentLength];
  datum.PostedFile.InputStream.Read(aryData,0,datum.PostedFile.ContentLength);
  objCom.Parameters.Add("@datum", aryData);
  objDb.Open();
  // データの登録
  objCom.ExecuteNonQuery();
  objDb.Close();
}
</script>
<html>
<head>
<title>バイナリ・データのデータベース投入</title>
</head>
<body>
<form runat="server" enctype="multipart/form-data">
ファイル:
<input type="file" id="datum" size="50" runat="Server" />
<asp:Button id="objBtn" runat="Server" Text="アップロード"
  OnClick="objBtn_Click" />
</form>
</body>
</html>
バイナリ・データをデータベースに登録するための.aspxファイル(C#の場合)
 
<%@ Page ContentType="text/html" Language="VB" %>
<%@ Import Namespace="System.IO" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<script runat="Server">
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")
  Dim objCom As New SqlCommand("INSERT INTO image_data(title,type,datum) VALUES(@title,@type,@datum)",objDb)
  ' title、typeフィールドには、それぞれアップロード・ファイルの
  ' ファイル名、コンテンツ・タイプをセットする
  objCom.Parameters.Add("@title",Path.GetFileName(datum.PostedFile.FileName))
  objCom.Parameters.Add("@type",datum.PostedFile.ContentType)
  ' アップロード・ファイルを入力ストリーム経由でbyte配列に読み込む
  Dim aryData(datum.PostedFile.ContentLength) As Byte
  datum.PostedFile.InputStream.Read(aryData,0,datum.PostedFile.ContentLength)
  objCom.Parameters.Add("@datum",aryData)
  objDb.Open()
  ' データの登録
  objCom.ExecuteNonQuery()
  objDb.Close()
End Sub
</script>
<html>
<head>
<title>バイナリ・データのデータベース投入</title>
</head>
<body>
<form runat="server" enctype="multipart/form-data">
ファイル:
<input type="file" id="datum" size="50" runat="Server" />
<asp:Button id="objBtn" runat="Server" Text="アップロード"
  OnClick="objBtn_Click" />
</form>
</body>
</html>
バイナリ・データをデータベースに登録するための.aspxファイル(VB.NETの場合)

 以上の.aspxファイルの実行結果は、以下のとおりだ。

サンプル・プログラムを実行したところ
[参照]ボタンで画像ファイル(この例では.jpgファイル)などのバイナリ・データを選択し、[アップロード]ボタンをクリックする。これにより、バイナリ・データがサーバ側にアップロードされ、データベースに格納される。

 このWebページ上で画像ファイルなどのバイナリ・データを指定してアップロードしてみよう。以下のようにそのバイナリ・データがデータベースに登録されているのが確認できるはずである。

ブラウザで指定したファイルをデータベース側で確認
ここではデータベースとしてMSDEを利用しているものとする。上の画面は、MSDEの中身をMicrosoft Accessのプロジェクト経由で参照したもの。プロジェクトについては、Windows TIPS「AccessをMSDEのフロントエンドとして利用する」を参照いただきたい。

 上記のサンプル・コードをご覧いただいても分かるように、バイナリ・ファイルを扱うといっても、さほど難しいことではない。ポイントとなるのは、HttpPostedFileクラス(System.Web名前空間)のInputStreamプロパティを介して、アップロード・ファイルをいったんbyte配列に格納しておく必要がある点だ。byte配列に格納してしまえば、後は通常のテキストと同様の要領でデータベースに格納できる。

 このようにしてデータベースに登録したデータを、再びWebフォーム上から呼び出す方法については、「TIPS:[ASP.NET]データベースに登録したバイナリ・データを表示するには?」で紹介している。End of Article

カテゴリ:Webフォーム 処理対象:データベース
カテゴリ:Webフォーム 処理対象:ファイル・アップロード
使用ライブラリ:HttpPostedFileクラス(System.Web名前空間)
関連TIPS:[ASP.NET]データベースに登録したバイナリ・データを表示するには?
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET MVC]ASP.NET MVCでアップロードしたファイルをデータベースに登録するには?
[ASP.NET]データベースに登録したバイナリ・データを表示するには?
[ASP.NET]ブラウザからファイルをアップロードできるようにするには?
アプリケーション内でデータベースをアタッチするには?
[ASP.NET]アプリケーションから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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH