none
データベースから取得したGIFファイルをImageに表示したい RRS feed

  • 質問

  • のですが、どうしたらいいのでしょうか。まず、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などでもやってみたいと思ってはいるのですが・・・。

     

    2007年6月13日 7:44

すべての返信

  • [ASP.NET]データベースに登録したバイナリ・データを表示するには?

    http://www.atmarkit.co.jp/fdotnet/dotnettips/257aspdbbinary2/aspdbbinary2.html

     

    まず、リンク先のような要領で画像取得専用のaspxを別に用意します。このaspxを、画像URLとしてImageコントロールから参照するようにします。

    っていうのが一般的だと思います。

    2007年6月13日 8:11
  • アドバイスありがとうございます。例えばwhile文の中に下記のコードを入れました。

     Response.ContentType = "image/gif";
                    Response.Flush();
                    Response.BinaryWrite((byte[])reader["pic"]);
                    Response.End();

    すると、画像は新しいページの様なところで表示されています。つまり、画像以外は白紙のフォーム。でも、URLは変わっていない。もちろん、これでは、Image1に表示する事も出来ません。これはどういった現象なのでしょうか。Response.WriteメソッドはExcelファイル出力で使ったことはあるのですが・・・。

    2007年6月13日 8:48
  • > 画像取得専用のaspxを別に用意します。

    > このaspxを、画像URLとしてImageコントロールから参照するようにします。

     

    このとおりにしました?

     

    たぶん今の状況は、画像を表示した直後にResponse.Endでブラウザに戻すデータを書き込む処理を

    終了してるので、画像のデータだけがブラウザ側に戻されているのだと思います。

    2007年6月13日 10:31
  • なるほど。別画面を作り、そこに今まで書いていたコードを貼り付け、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つ目の画像が表示されています。

    2007年6月14日 1:00
  • 画像が必要な枚数分、StoreImage.aspxを呼び出すことになります。

    クエリ文字列として該当するデータのキー項目を渡してあげて、それに対応する画像をダウンロードするようにすればよいかと思います。

     

    2007年6月14日 1:35
  • すいません。もう少し詳しく教えてもらえませんか。クエリ文字列を取得するページは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を使わずに拾えるということがです)
    2007年6月14日 2:34
  • データベースから画像の情報をとりだすSQL文にキーを利用することで、必要な画像1枚の情報だけを取り出すようにしましょう。

     

    > 僕にとってはなぜ、Image1.ImageUrl = "StoreImage.aspx"で画像が取り込めるのかも不思議です。

     

    普通にHTMLのIMGタグのソースとしてStoreImage.aspxが指定されているだけですね。

    しかも、StoreImage.aspxは現状ではデータベースからすべての画像のデータをとってきて、その一番最初のデータをダウンロードしているだけなので、別ページの情報を拾ってるわけではないですね。

     

     

    2007年6月14日 3:52
  • <<データベースから画像の情報をとりだすSQL文にキーを利用することで、必要な画像1枚の情報だけを取り出すようにしましょう。

     

    すいません。よくわかっていないんですが、キーと言うのはなんでしょうか。string t = (string)reader["image_name"]ではないんですよね。それと、複数の画像を取り出すことは出来るんでしょうか。

     

    <<普通にHTMLのIMGタグのソースとしてStoreImage.aspxが指定されているだけですね。

    しかも、StoreImage.aspxは現状ではデータベースからすべての画像のデータをとってきて、その一番最初のデータをダウンロードしているだけなので、別ページの情報を拾ってるわけではないですね。

     

    ここは良くわかりました。ページごとimgのソースとして指定しているんですね。それで、querystringで一意のページを作ればいいのでしょうが、上記したようにSQL文にキーという部分がわかればと思います。

    2007年6月14日 4:49
  • イメージ的には以下のような感じでしょう。

     

    データベースにある画像データを表示する方法
     http://www.microsoft.com/japan/msdn/asp.net/tips/DataBaseImage2/

     

    #私ならカスタムHTTPハンドラ(.ashx)を使うかなぁ?

    2007年6月14日 5:19
    モデレータ