質問者
データベースから取得したGIFファイルをImageに表示したい

質問
-
のですが、どうしたらいいのでしょうか。まず、sql serverにGIFファイルをinsertしまして、それを呼び込んでImage1に表示させようとしているのが下記のコードです。
SqlConnection conn = new SqlConnection();
try
{
conn.ConnectionString = "Data Source=******\\SQLEXPRESS;Integrated Security=True";
conn.Open();SqlCommand comm = new SqlCommand();
comm.Connection = conn;
comm.CommandText = "Select image_name, pic from ImageTest";
SqlDataReader reader = comm.ExecuteReader();
while (reader.Read())
{
string name = (string)reader["image_name"];
byte[] test = new byte[reader.GetBytes(1, 0, null, 0, int.MaxValue)];
MemoryStream mem = new MemoryStream(test, 0, test.Length);
//このあとに、Image1に画像を表示させたい。memに値は入っている(はず)。いろいろサイトを見てここまでは出来たのですが、Imageにこのmemをバインドするのに適しているインテリセンスが見当たりません。更に別のプロセスがあるのでしょう。これが出来たら、Gridviewなどでもやってみたいと思ってはいるのですが・・・。
すべての返信
-
[ASP.NET]データベースに登録したバイナリ・データを表示するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/257aspdbbinary2/aspdbbinary2.html
まず、リンク先のような要領で画像取得専用のaspxを別に用意します。このaspxを、画像URLとしてImageコントロールから参照するようにします。
っていうのが一般的だと思います。
-
アドバイスありがとうございます。例えばwhile文の中に下記のコードを入れました。
Response.ContentType = "image/gif";
Response.Flush();
Response.BinaryWrite((byte[])reader["pic"]);
Response.End();すると、画像は新しいページの様なところで表示されています。つまり、画像以外は白紙のフォーム。でも、URLは変わっていない。もちろん、これでは、Image1に表示する事も出来ません。これはどういった現象なのでしょうか。Response.WriteメソッドはExcelファイル出力で使ったことはあるのですが・・・。
-
なるほど。別画面を作り、そこに今まで書いていたコードを貼り付け、Imageがあるページに戻り、Image1.ImageUrl = "~/StoreImage.aspx"; と指定して無事に表示されました。ありがとうございました。ただ、1つのgifファイルに対しては、これでいいのですが、データベースに何枚もファイルがあり、それをGridView等に表示させたい時はどうすればいいのでしょうか。例えばオンラインショッピングで画像と詳細情報のリストがずらっと表示させたい場合等です。
while (reader.Read())
{
string name = (string)reader["image_name"];
Response.ContentType = "image/gif";
Response.Flush();
Response.BinaryWrite((byte[])reader["pic"]);
// Response.End();}
別画面に書いたコードは上記です。Response.End()をはずすと、一応ループしますが、配列になっている訳でもないので、1つ目の画像が表示されています。
-
すいません。もう少し詳しく教えてもらえませんか。クエリ文字列を取得するページはImageを表示させたいページでしょうか?とすると、
Image1.ImageUrl = "StoreImage.aspx?id=" + //ここに何か入るのでしょうか?
しかし、画像データを取得するStoreImage.aspxは前回でも書いたように、
while (reader.Read())
{
string name = (string)reader["image_name"];
Response.ContentType = "image/gif";
Response.Flush();
Response.BinaryWrite((byte[])reader["pic"]);}
としているので、キーを記述の仕方がいまいちわかりません。通常のResponse.Redirectでクエリ文字列を取得する方法ならわかるのですが・・・。強引にSession["image_name"] = name;とセッションに突っ込もうとしましたが、Image1.ImageUrl = "StoreImage.aspx?id=" + (string)Session["image_name"];のセッションの部分はNullでした。
このメカニズムは初めてなので、仕組みがわかりにくいですね。僕にとってはなぜ、Image1.ImageUrl = "StoreImage.aspx"で画像が取り込めるのかも不思議です。(つまり別ページの情報をQueryString,Sessionを使わずに拾えるということがです) -
-
<<データベースから画像の情報をとりだすSQL文にキーを利用することで、必要な画像1枚の情報だけを取り出すようにしましょう。
すいません。よくわかっていないんですが、キーと言うのはなんでしょうか。string t = (string)reader["image_name"]ではないんですよね。それと、複数の画像を取り出すことは出来るんでしょうか。
<<普通にHTMLのIMGタグのソースとしてStoreImage.aspxが指定されているだけですね。
しかも、StoreImage.aspxは現状ではデータベースからすべての画像のデータをとってきて、その一番最初のデータをダウンロードしているだけなので、別ページの情報を拾ってるわけではないですね。
ここは良くわかりました。ページごとimgのソースとして指定しているんですね。それで、querystringで一意のページを作ればいいのでしょうが、上記したようにSQL文にキーという部分がわかればと思います。
-
イメージ的には以下のような感じでしょう。
データベースにある画像データを表示する方法
http://www.microsoft.com/japan/msdn/asp.net/tips/DataBaseImage2/#私ならカスタムHTTPハンドラ(.ashx)を使うかなぁ?