-1

httphandler を作成して画像の URL を取得し、後で画像コントロールに表示しようとしています。このコードを使用していますが、機能していません。

OleDbConnection mDB = new OleDbConnection(
     ConfigurationManager.ConnectionStrings["AccessConnection"].ConnectionString);
     mDB.Open();
     OleDbCommand cmd = new OleDbCommand("select pProductId from Products where pProductId=" + context.Request.QueryString["ImageID"], mDB);
     OleDbDataReader rdr = cmd.ExecuteReader();
     rdr.Read();
     context.Response.BinaryWrite((byte[])rdr[0]);
     mDB.Close();
     context.Response.End(); */

SELECT ステートメントの前半で混乱を招いて申し訳ありませんが、pProductId には画像の URL が含まれていません。代わりに、pProductImage は URL を含むフィールドです。Id を使用して、それに応じて表示する画像を識別しています。

これは私の期待される出力です:

<img src="ImgHandler.ashx?pProductId=2" alt="" />

画像を配置できません。これは私のエラー メッセージへのリンクです: http://imgur.com/Cix67

4

1 に答える 1

1

これは2段階の答えです。このページでは、次のようなことができます。

        using (OleDbConnection mDB = new OleDbConnection(ConfigurationManager.ConnectionStrings["AccessConnection"].ConnectionString))
        {
            mDB.Open();
            using (OleDbCommand cmd = new OleDbCommand("select pProductId from Products where pProductId=" + context.Request.QueryString["ImageID"], mDB))
            {
                using (OleDbDataReader rdr = cmd.ExecuteReader())
                {
                    rdr.Read();
                    context.Response.Write("<img src=\"ImgHandler.ashx?pProductId=");
                    context.Response.Write((int)rdr[0]);  // I suppose pProductId is an int, adapt accordingly
                    context.Response.Write("\" />");
                }
            }
        }

暗黙的にトリガーされる HTTP ハンドラーでは、次のようになります。

public class MyHandler : IHttpHandler
{
    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        using (OleDbConnection mDB = new OleDbConnection(ConfigurationManager.ConnectionStrings["AccessConnection"].ConnectionString))
        {
            mDB.Open();
            // select the file data (I put pData here as a placeholder, and assume it will be a byte[])
            using (OleDbCommand cmd = new OleDbCommand("select pData from Products where pProductId=" + context.Request.QueryString["ImageID"], mDB))
            {
                using (OleDbDataReader rdr = cmd.ExecuteReader())
                {
                    rdr.Read();
                    context.Response.ContentType = "image/png";// put the content type here
                    context.Response.BinaryWrite((byte[])rdr[0]);
                }
            }
        }
    }
}

一度使用すると適切なリソースのクリーンアップを保証する使用パターンに注意してください。また、理想的には、適切なキャッシュ HTTP ヘッダー (if-modified-since など) を使用してクライアントにデータをキャッシュできますが、これは別の話です ...

于 2012-12-27T16:56:19.763 に答える