5. ASP.NET 2.0 データ ソース コントロール コードを使用して画像をアップロードし、バイナリ データを保存します。ADO.NET
メソッドは ASP.NET 2.0 アプリケーションのコンテキストで機能しますが、ASP.NET 2.0 データ ソース コントロールを使用してバイナリ データを保存することもできます。バイナリ データはデータベースに保存されるため、ADO.NET コードを記述する必要はありません。このデモ プログラムで使用される SqlDataSource コントロールには、InsertCommand と、Title、MIMEType、および ImageData の値に対応するパラメーターが含まれています。
InsertCommand="INSERT INTO [Pictures] ([Title], [MIMEType], [ImageData]) VALUES (@Title, @MIMEType, @ImageData)">
<asp:パラメータ名="タイトル" タイプ="文字列" />
<asp:パラメータ名="MIMEType" タイプ="String" />
<asp:パラメータ名="画像データ" />
</InsertParameters>
</asp:SqlDataSource>
ここで、ImageData パラメーターはタイプを指定しないことに注意してください。 GUI ウィザードを使用して SqlDataSource の構文を構築しようとすると、おそらく Type="Object" が指定されますが、この Type="Object" は sql_variant 型のパラメーターを生成します。ただし、sql_variant の固有データ サイズは 8,000 バイトを超えることができないため、sql_variants 型を使用してイメージまたは varbinary (MAX) データ型を保存することはできません。 (Type="Object" を使用し、サイズが 8,000 バイトを超えるバイナリ データを保存しようとすると、システムは「パラメーター'@ImageData'が sql_variant データ型のサイズ制限を超えています」というメッセージを含む例外をスローします。サイズが 8,000 バイト未満のバイナリ データを追加しようとすると、例外によって「データ型 sql_variant から varbinary(max) への暗黙的な変換は許可されていません」というメッセージが表示されます。
さらに、DetailsView コントロールには 2 つの TemplateField が含まれています。このうち、1 つの TemplateField では TextBox コントロールを使用してタイトル バーを表示し、もう 1 つは FileUpload コントロールを使用して ImageData バーを表します。最終的には、「ADO.NET コードを使用した画像のアップロードとバイナリ データの保存」セクションのユーザー インターフェイスに似たユーザー インターフェイスが作成されます。詳細ビューの「挿入」ボタンをクリックすると、その挿入イベントが発生します。このとき、バイナリ データを FileUpload コントロールから取得し、バイト配列に読み込んで、適切なパラメータに割り当てる必要があります。
Protected Sub UploadPictureUI_ItemInserting(ByVal) sender As Object 、 ByVal e As System.Web.UI.WebControls.DetailsViewInsertEventArgs) UploadPictureUI.ItemInserting を処理します
'FileUpload コントロールを参照します Dim UploadedFile As FileUpload = CType(UploadPictureUI.FindControl("UploadedFile"), FileUpload)
'ファイルが正常にアップロードされたことを確認しますIf UploadedFile.PostedFile Is Nothing OrElse String.IsNullOrEmpty(UploadedFile.PostedFile.FileName) OrElse UploadedFile .PostedFile .InputStream は何もありません
...エラーメッセージを表示...
e.キャンセル = True
出口サブ
End If
'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"
それ以外の場合
'アップロードするファイルの種類が無効です...エラー メッセージが表示されます...
e.キャンセル = True
出口サブ
終了
「MIMETypeパラメータとImageDataパラメータの値を指定する」
を選択します
e.Values("MIMEType") = MIMEType
'FileUploadのInputStreamをバイト配列にロードします
Dim imageBytes(UploadedFile.PostedFile.InputStream.Length) バイトとして
UploadFile.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
e.Values("ImageData") = imageBytes
End Sub
前の「挿入」ボタンの Click イベント ハンドラーと同様に、DetailsView の Inserting イベント ハンドラーも同じロジックを実行します。構文の小さな違いがいくつかあるだけです。まず、FileUpload コントロールはテンプレート内にあるため、FindControl("controlID") メソッドを使用してプログラムで参照する必要があります。参照されると、同じチェックが実行され、ファイルが正常にアップロードされたことと、適切な拡張子が許可されたことが確認されます。詳細ビューの挿入イベント ハンドラーとのわずかな違いは、エラーが発生した場合、対応する挿入作業を停止するように詳細ビューに通知する必要があることです。これは、e.Cancel プロパティを True に設定することで実現されます。
確認後、MIMEType パラメーターと ImageData パラメーターは e.Values("parameterName")=value 構文を使用して割り当てられます。前の ADO.NET の例と同様に、最初にバイナリ データをバイト配列に読み取り、次にそのバイト配列をパラメータに割り当てます。
6. バイナリ コンテンツの表示
データベースにデータを保存するためにどのようなテクノロジを使用するとしても、バイナリ データを取得して表示するには、新しい ASP.NET ページを作成する必要があります。 ShowPicture.aspx という名前のページは、クエリ文字列を通じて PictureID を渡し、指定された製品の ImageData フィールドからバイナリ データを返します。完了したら、アドレス /ShowPicture.aspx?PictureID=picutreID にアクセスすると、特定の画像が表示されます。したがって、Web ページに画像を表示するには、画像コントロールを使用し、その ImageUrl プロパティを適切な URL に設定します。
ShowPicture.aspx の .aspx ページには HTML タグが含まれていないことに注意してください。コードビハインド クラスの Page_Load イベント ハンドラーでは、ADO.NET コードを使用して、指定された Pictures 行の MIMEType と ImageData をデータベースから取得します。次に、ページの ContentType が MIMEType フィールドの値に設定され、Response.BinaryWrite(ImageData):
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me を使用してバイナリ データが出力されます。負荷
Dim PictureID As Integer = Convert.ToInt32(Request.QueryString("PictureID"))
'myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings("ImageGalleryConnectionString") を使用してデータベースに接続し、指定された画像の画像コンテンツと MIME タイプを返します。 ConnectionString)
Const SQL As String = "SELECT [MIMEType], [ImageData] FROM [Pictures] WHERE [PictureID] = @PictureID"
myCommand を新しい SqlCommand(SQL, myConnection) として暗くする
myCommand.Parameters.AddWithValue("@PictureID", PictureID)
myConnection.Open()
Dim myReader As SqlDataReader = myCommand.ExecuteReader
If myReader.Read then
Response.ContentType = myReader("MIMEType").ToString()
Response.BinaryWrite(myReader("画像データ"))
End If
myReader.Close()
myConnection.Close()
使用を終了する
エンドサブ