1. はじめに
データ駆動型アプリケーションを構築する場合、多くの場合、テキスト データとバイナリ データをキャプチャする必要があります。このようなプログラムでは、画像、PDF、Word ファイル、またはその他のバイナリ データを保存する必要がある場合があります。このバイナリ データを保存するには 2 つの方法があります。Web サーバーのファイル システムに保存する方法と、データベース内の対応するファイルへの参照を追加する方法、またはデータベース自体に直接保存する方法です。
文字列、数値、日付、GUID、金額などのテキスト データには、データベース システム内で適切な対応するデータ型定義があります。たとえば、Microsoft SQL Server では、int データ型を使用して整数値を格納でき、文字列値を格納するには varchar または nvarchar 型を使用できます。さらに、データベースはバイナリ データを保存するための型定義も提供します。 Microsoft SQL SERVER 2000 以前のバージョンでは、バイナリ データの格納にイメージ データ型が使用されますが、SQL SERVER 2005 では、varbinary (MAX) データ型が使用されます。これらのデータ型は、上記の 2 つの方法のいずれかを使用して、最大 2 GB のサイズのバイナリ データを保存できます。
ただし、バイナリ データをデータベースに直接保存する場合は、バイナリ データを挿入、更新、取得するために追加の作業が必要になります。幸いなことに、ADO.NET などの高レベルのデータ アクセス ライブラリを通じてこの複雑な低レベル T-SQL 操作を抽象化できるため、問題は非常に単純になります。ただし、ADO.NET を介したバイナリ データの操作は、テキスト データの操作とは少し異なります。この記事では、ADO.NET と ASP.NET 2.0 SqlDataSource コントロールを使用して、データベースに画像ファイルを直接保存および取得する方法を分析します。ぜひ読んでみてください!
2. データをデータベースに保存する場合とファイル システムに保存する場合の比較
先ほど説明したように、アプリケーションでバイナリ データをキャプチャする場合、バイナリ データはデータベースに直接保存することも、Web 上のファイルとして保存することもできます。ファイル システム - データベース内のファイルへの参照のみが維持されます。私の経験から、ほとんどの開発者は主に次の理由から、バイナリ データをファイル システムに保存することを好むことがわかりました。
· 必要な労力が少ない - データベースに保存されたバイナリの保存と取得には、より多くのコーディング作業が必要です。さらに、これらのバイナリ データの更新も簡単になります。データベースと通信する必要がなく、ファイルを直接変更するだけです。
· ファイルを指す URL はより直接的です - この記事で説明するように、データベースに格納されているバイナリ データへのアクセスを提供するには、そのデータを返すことができる別の ASP.NET ページを作成する必要があります。通常、データベース内の対応するレコードに対応する一意の識別子 (バイナリ データを返す) がこのページに渡されます。その結果、バイナリ データ (アップロードされた画像など) にアクセスする場合、URL はhttp://www.yourserver.com/ShowImage.aspx?ID=4352のようになりますが、画像がファイルに直接保存されている場合は、システムの場合、URL はより直接的になります (例: http://www.yourserver.com/UploadedImages/Sam.jpg)。
· 画像表示のためのツール サポートの向上 - ASP.NET 2.0 を使用している場合は、GridView またはDetailsView コントロールの ImageField コントロールを使用して画像を表示できます (画像パスはデータベースに保存されます)。ただし、残念ながら、この ImageField はデータベース内の画像データを直接表示できません (外部ページにクエリを実行し、対応するデータを返す必要があるため)。
· パフォーマンス - バイナリ ファイルはデータベースではなく Web サーバーのファイル システムに保存されるため、アプリケーションがアクセスできるデータベース内のデータが少なくなり、データベースの要件が軽減され、それに応じて Web 上の要件と、Web サーバー間のネットワークの輻輳も軽減されます。データベースサーバー。
データをデータベースに直接保存する主な利点は、データが「自己完結型」になることです。すべてのデータがデータベースに含まれるようになったことで、ファイル システムに保存されているバイナリ コンテンツのコピーやバックアップについて心配する必要がなくなり、データのサポート、データベース サーバー間のデータの移動、データベースのレプリケーションなどがはるかに簡単になりました。
いつものように、どのストレージ ソリューションを選択するかは、実際の使用場所とビジネス ニーズによって異なります。たとえば、私が開発したクライアントでは、バイナリ データをデータベースに保存する必要がありました。これは、クライアントが使用していたレポート ソフトウェアでは、バイナリ データがデータベースから取得された場合のみレポートに含めることができたためです。別のケースでは、私の同僚がバイナリを Web アプリケーションで使用し、FTP 経由で利用できるようにする必要があるプロジェクトに取り組んでいました。その場合、バイナリ データをファイル システムに保存する必要がありました。
3. バイナリ データを格納するデータベース テーブルを作成する
この記事の残りの部分では、Microsoft SQL Server 2005 Express Edition を使用して作成した単純な ASP.NET 2.0 イメージ ギャラリー アプリケーションを分析し、バイナリ データの格納と取得に関連する直接的な概念を示します。データベース。
この画像ギャラリー アプリケーションのデータ モデルは、テーブル「Pictures」で構成されており、各レコードはギャラリー内の画像に対応します。この Pictures テーブルの MIMEType フィールドには、アップロードされた画像の MIME タイプ (JPG ファイルの場合は image/jpeg、GIF ファイルの場合は image/gif など) が格納されます。ここでの MIME タイプは、バイナリ データの生成方法をブラウザに指定します。 ImageData 列には、画像の実際のバイナリ コンテンツが格納されます。
4. ADO.NET コードを使用して画像をアップロードし、バイナリ データを保存します。
この画像ギャラリーを使用すると、訪問者は画像ファイル (GIF、JPG、および PNG 形式) をこのアプリケーションにアップロードできます。アップロードすると、新しいレコードが Pictures テーブルに追加され、画像ファイルの内容が新しいレコードの ImageData 列に保存されます。 ASP.NET 2.0 で Web ブラウザから Web サーバーにファイルをアップロードするために、この例では FileUpload コントロールが使用されます。 FileUpload コントロールの使用は非常に簡単です。ツールバーからページにドラッグするだけです。最終的に、この FileUpload コントロールは、標準のファイル アップロード フォームとしてユーザーのブラウザに生成されます。[参照] ボタン (クリックすると) により、ユーザーはハード ドライブからファイルを選択して Web サーバーにアップロードできます。
たとえば、新しい画像を追加するためのインターフェイスを作成するには、TextBox コントロールを使用して画像のタイトルをキャプチャし、FileUpload コントロールを使用してユーザーがアップロードする画像を指定できるようにしました:
<b>Title:</b>
<asp:TextBox ID="PictureTitle" runat="server" />
<br />
<b>写真:</b>
<asp:FileUpload ID="UploadedFile" runat="server" />
<br />
<asp:LinkButton ID="btnInsert" runat="server" Text="Insert" />
<asp:LinkButton ID="btnCancel" runat="server" Text="Cancel" />
上記のコードは、ユーザーがハード ドライブから Web サーバーにアップロードするファイルを指定できるページを作成します。
ユーザーがファイルを選択してフォームを送信すると (たとえば、[挿入] ボタンをクリックすることによって)、指定されたファイルのバイナリ コンテンツが Web サーバーに送信されます。次のマークアップとコードで示されているように、サーバー側のコードから、このバイナリ データは FileUpload コントロールの PostedFile.InputStream プロパティを通じて利用できるようになります。
Protected Sub btnInsert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnInsert 。クリック
'ファイルが正常にアップロードされたことを確認してください
もし、UploadedFile.PostedFile が何もない場合、または Else String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse、UploadedFile.PostedFile.InputStream が何もない場合、
...エラーメッセージを表示...
出口サブ
終了の場合
'JPG または GIF ファイルを使用していることを確認してください
Dim 拡張子 As String = Path.GetExtension(UploadedFile.PostedFile.FileName).ToLower()
Dim MIMEType As String = なし
大文字と小文字の拡張子を選択してください
ケース「.gif」
MIMEType = "画像/gif"
「.jpg」、「.jpeg」、「.jpe」の場合
MIMEType = "画像/jpeg"
ケース「.png」
MIMEType = "画像/png"
それ以外の場合
'アップロードするファイルの種類が無効です...エラー メッセージが表示されます...
出口サブ
終了
「データベースに接続し、Products テーブルに新しいレコードを挿入する」
を選択します
myConnection を新しいものとして使用する SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString").ConnectionString)
Const SQL As String = "INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @画像データ)」
myCommand を新しい SqlCommand(SQL, myConnection) として暗くする
myCommand.Parameters.AddWithValue("@Title", PictureTitle.Text.Trim())
myCommand.Parameters.AddWithValue("@MIMEType", MIMEType)
'FileUpload コントロールの InputStream をバイト配列にロードします
Dim imageBytes(UploadedFile.PostedFile.InputStream.Length) バイトとして
UploadFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
myCommand.Parameters.AddWithValue("@ImageData", imageBytes)
myConnection.Open()
myCommand.ExecuteNonQuery()
myConnection.Close()
使用を終了する
End
Sub ここで、このイベント ハンドラーは、まずファイルがアップロードされたことを確認します。次に、アップロードされるファイル拡張子に基づいて MIME タイプを決定します。
上記の最も注目すべき部分は、@ImageData パラメーターを設定するコードのセクションです。まず、imageBytes という名前のバイト配列を作成し、その長さをアップロードするファイルの対応する InputStream にします。次に、InputStream の Read メソッドを使用して、バイナリ コンテンツをこのバイト配列に書き込みます。 @ImageData の値として指定されるのはこのバイト配列であることに注意してください。