- PR -

画像データをImageコントロールに表示したいのですが

投稿者投稿内容
Jetta
常連さん
会議室デビュー日: 2008/10/15
投稿数: 44
投稿日時: 2009-01-22 18:58
asp.net VS2005、SQLserver2005で、WEBページの開発をしています。

WEBページ上で、DBに格納した画像データ(DBの列の型はimageです)を、画面に配置したImageコントロールに表示したいと思っているのですが、Imageコントロールにセットする方法が分からず困っています。

ネット上色々と調べ、ImageコントロールのImageUrlプロパティーにセットするような感じまではなんとなく分かったのですが、DB上にあるデータなのでUrlの記載内容が分かりません。
それとも他のプロパティー又は、他の良い表示方法があるのでしょうか?

どなかたご存知の方がいらしたらご教授お願い致します。
Jetta
常連さん
会議室デビュー日: 2008/10/15
投稿数: 44
投稿日時: 2009-01-22 19:03
すいません、追記です。

Response.BinaryWriteでの別フォームへの表示ではなく、現在の画面上のある場所に表示する必要があります。

よろしくお願いします。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-01-22 19:12
HTTP ハンドラ (拡張子 .ashx) を使用すれば可能です。
Response.BinaryWrite で画像を出力する HTTP ハンドラを作成し、
ImageUrl プロパティに、作成した HTTP ハンドラの URL を設定します。
_________________
C#と諸々
Jetta
常連さん
会議室デビュー日: 2008/10/15
投稿数: 44
投稿日時: 2009-01-22 21:02
よこけんさん。

アドバイスありがとうございます。

早速新規でxxx.ashxを作成してみたのですが、初めてのashxファイルの対応で使用方法すら分かりません(お恥ずかしい。。。)。

作成した時点で下記のソースが生成されました。


<%@ WebHandler Language="VB" Class="image01" %>

Imports System
Imports System.Web

Public Class image01 : Implements IHttpHandler

Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
context.Response.ContentType = "text/plain"
context.Response.Write("Hello World")
End Sub

Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property

End Class


■Class image01 内にDBから画像データを読み込み、Response.BinaryWrite にて画像を表示する処理を記載すれば良いのでしょうか?

すいませんが、よろしくお願いします。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-01-22 23:06
> 使用方法すら分かりません

難しいものではないです。とりあえず、生成されたまま書き換えず、作成した HTTP ハンドラ の URL をブラウザに入力してアクセスしてみてください。
Response.Write で書き込んだ "Hello World" という文字列をブラウザが受け取っていることがわかると思います。

> Class image01 内にDBから画像データを読み込み、Response.BinaryWrite にて画像を表示する処理を記載すれば良いのでしょうか?

そうです。
DB から画像を読み込む処理は、HTTP ハンドラが行っても良いし、他の場所の方が適切なのならば他の場所でも構いません。HTTP ハンドラでも、URL のクエリー文字列を利用できますし、セッションも利用できますので。(HTTP ハンドラでセッションを利用する場合は、IRequiresSessionState を継承する必要がありますので注意してください。)
あと、忘れてましたが ContentType を正しく設定する必要もあります。例えば画像形式が Jpeg なら "image/jpeg" を設定します。
_________________
C#と諸々
Jetta
常連さん
会議室デビュー日: 2008/10/15
投稿数: 44
投稿日時: 2009-01-22 23:13
よこけんさん。

何度もありがとうございます。

先程アドバイスを頂いてから色々と試しています(まだ出来ませんが。。。)。

> そうです。
> DB から画像を読み込む処理は、HTTP ハンドラが行っても良いし、他の場所の方が適切なのならば他の場所でも構いません。
やりながらですが、なんとなくイメージがつかめはじめてます。

> あと、忘れてましたが ContentType を正しく設定する必要もあります。
はい。こちらはDBに画像データを書き込む時に一緒に格納するようにしてあります。
ので、読み込んでこちらを使用すれば良いと認識しました。

まだaspの経験も3ケ月程ですので試行錯誤していますが、結果が出ましたらスレッドに書き込ませて頂きます。

まずは、ありがとうございました。
Jetta
常連さん
会議室デビュー日: 2008/10/15
投稿数: 44
投稿日時: 2009-01-23 01:06
よこけんさん。

アドバイス頂いたやり方で画像を表示する事が出来ました。
大変感激しており、大変助かりました。本当にありがとうございました。

図々しいようですいませんが、セッションについて教えて下さい。
今はテスト的にやったのですが実装するには、画面で選択された商品の商品コードでDBを検索し、イメージデータを表示するつもりでいます。

そこで問題となるのが、今回HTTPハンドラ(.ashx)側でDBを読み込むようにしたため、HTTPハンドラに商品コードを引き渡さなくてはなりません。

> 。(HTTP ハンドラでセッションを利用する場合は、IRequiresSessionState を継承する必要がありますので注意してください。)
こちらのアドバイスが気になりIRequiresSessionState を調べてみたのですが、これは型のようですね。

今までセッションデータの受け渡しには、例えば Session("code") = shohin_code のように記述して行っていました。
従いまして、型もなかったので記述方法が分かりません。

よろしかったら教えて頂けると助かります。

よろしくお願い致します。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2009-01-23 01:31
IRequiresSessionState インターフェイスについては単に

コード:
Public Class image01 : Implements IHttpHandler



コード:
Public Class image01 : Implements IHttpHandler, IRequiresSessionState


とするだけの話です。


> 例えば Session("code") = shohin_code のように記述して行っていました。

そのコードの場合、Page クラスの Session プロパティを使っていることになりますね。
Page クラスはセッションに簡単にアクセスできるよう、Session プロパティを持っています。
一方、HTTP ハンドラにはセッションに簡単にアクセスするためのプロパティは用意されていません。
なので、次のような手順を踏んでセッションにアクセスします。

コード:
Dim currentContext As HttpContext = HttpContext.Current

Dim code As String = currentContext.Session("code")


コードの記述量が増えますが、特に処理の違いはありません。


商品コードはセッションで渡しても良いですが、URL のクエリー文字列でも渡せますね。
例えば、Image コントロールの ImageUrl を
http://localhost/Hoge/Fuga.ashx?code=xxx
と設定してやれば、HTTP ハンドラでは、

コード:
Dim currentContext As HttpContext = HttpContext.Current

Dim code As String = currentContext.Request.QueryString["code"]


というような具合で、商品コードを取得できます。(code 変数に "xxx" が格納されます。)


_________________
C#と諸々


[ メッセージ編集済み 編集者: よこけん 編集日時 2009-01-23 01:33 ]

スキルアップ/キャリアアップ(JOB@IT)